-6

我现在对数据类型有点迷失了。

在我正在构建的应用程序中,我有一个必须运行查询的函数,具体取决于Array客户 ID。

必须在特定条件下覆盖数据,并使用由 ID 字符串组成的数组。

问题是Split()函数返回 a string[],而我的数据是 a Array。我可以将新值分配给data,如下所示,但是我不能再访问数据了。

这是因为对于 a Array,我必须使用data.GetValue(i),而 astring[]只能使用data[i].

精简代码:

internal void GetData(Array data) {

    string ids == "123,456,789";

    if(condition){
        data = (Array) ids.Split(',').ToArray(); // Trying to convert it to a Array, can't figure it out...
    }

    // Accessing the data at index `i`
    data.GetValue(i); // Default case, works when the condition is false
    data[i];          //     This only works when the condition is true
}

所以,我的问题是,有没有办法让我将拆分字符串保存到 aArray而不是 a string[]


完整代码:

internal M.RequestCustomQueryResultsList GetData(Array data) {
    M.RequestCustomQueryResultsList result = new M.RequestCustomQueryResultsList();
    result.CustomQueryResults = new List<CustomQueryResult>();

    SqlConnection conn = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand();

    conn.Open();
    cmd.CommandType = CommandType.Text;
    cmd.Connection = conn;
    cmd.CommandText = queriesQuery; // StacOverflow: A query to obtain some queries

    SqlDataReader reader = cmd.ExecuteReader();
    while(reader.Read()) {
        // For each query
        SqlConnection conn1 = new SqlConnection(connectionString);
        conn1.Open();

        /* StackOverflow: The real relevant stuff starts here. */

        String query = reader["Query"].ToString(); // Get the current query

        Match match = Regex.Match(query, @"{((?:\w,?)*)}");

        if(match.Success) { // If the query contains "{0}" or "{123,456,789,etc}"
            string m = match.Groups[1].Value; // get the value in the "{}"
            if(!m.Equals("0")){ // If that value isn't "123,456,etc"
                data = m.Split(','); // Split up the id's into an array.
            }
            for(int i = 0; i < data.Length; i++) { // Loop through the data (Works if m.Equals("0"))
                // Execute the query for every company.
                String q = string.Format(query, data.GetValue(i).ToString()); // Fails
                CustomQueryResult c = new CustomQueryResult();

                c.CustNo = int.Parse(data.GetValue(i).ToString());  // Fails

                // Here I set some more values to c, add c  to `result`, and close all loops / etc.

GetData是作为GetCustomQueriesResults对服务的请求调用的一部分。

public T.RequestCustomQueryResultsList GetCustomQueriesResults(Array data) {
    var CustomQueriesResultsList = new S.CustomQueriesResultsList(data);
    return CustomQueriesResultsList.GetData(data);
}

我从 JavaScript 调用服务,如下所示:

repo.GetCustomQueriesResults([123,456,789]);

JSON.stringify(data)存储库构建一个用作data参数的 ajax 请求。

4

4 回答 4

5

Astring[]已经是 a Array(因为从 派生的每个具体数组类型Array)-并且Split已经给出 a string[],因此您不需要调用ToArray结果。

所以这:

data = (Array) ids.Split(',').ToArray();

只能是:

data = ids.Split(',');

结果一个数组,所以没有其他工作要做。

请注意,更改 的值根本不会data更改调用者的数组,如果这是出了问题的话。你应该阅读我关于参数传递的文章,以了解更多关于这方面的信息。

编辑:现在我们可以看到您的代码,我相信问题与数组几乎没有关系。是这样的:

String q = string.Format(query, data.GetValue(i).ToString()); // Fails

强烈怀疑您的查询包含类似{1}尝试使用不存在的参数进行格式化的内容。

验证这一点应该很容易 - 只需将部分分开:

String value = data.GetValue(i).ToString();
String q = string.Format(query, value);
于 2013-01-18T13:41:36.050 回答
0

GetValue在这两种情况下都可以正常工作(请参见下面的 LinqPad 片段)。这是意料之中的,因为Array它是所有数组的基类,所以GetValue是继承的。你可能在其他地方做错了什么。

void Main()
{
    Array myArr = Array.CreateInstance( typeof(String),1);
    myArr.SetValue("a",0);
    GetData(myArr,true); // condition is true, use the split. Outputs "123"
    GetData(myArr,false); // use the array we pass to the method. Outputs "a"   
}

void GetData(Array data, bool condition) {

    string ids = "123,456,789";

    if(condition) 
    {
        data = ids.Split(','); 
    }
    Console.WriteLine(data.GetValue(0)); 
}
于 2013-01-18T13:57:03.477 回答
0

ArrayType没有声明任何索引器。这就是为什么您不能在 Array 类型的对象上使用 [] 的原因。

说我无法理解在 Split() 结果上调用索引器的能力来自哪里。

但是你可以更换

GetData(Array data)

经过

GetData(Object[] data)

这在我的脑海中具有相同的含义。

于 2013-01-18T14:09:48.447 回答
0

只需分配它:

data = ids.Split(',');

你不需要演员表,也不需要ToArray.

于 2013-01-18T13:41:54.270 回答