-6

現時点では、データ型について少し迷っています。

私が構築しているアプリケーションには、Array顧客 ID に応じてクエリを実行する関数があります。

データは、ID の文字列から形成された配列を使用して、特定の条件で上書きする必要があります。

問題は、Split()関数が a を返すのstring[]に対し、私のデータはArray. 以下に示すように、新しい値を に割り当てることはdataできますが、データにアクセスできなくなります。

これは、 aArrayには を使用する必要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.

GetDataGetCustomQueriesResultsサービスへのリクエストとして呼び出されるの一部です。

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)リポジトリは、パラメーターとして使用する ajax リクエストを作成しdataます。

4

4 に答える 4

5

Astring[]はすでにArray( から派生した各具体的な配列型であるためArray) であり、Splitすでに を与えているため、結果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

それを割り当てるだけです:

data = ids.Split(',');

キャストは必要ありませんToArray

于 2013-01-18T13:41:54.270 に答える
0

ArrayTypeはインデクサーを宣言しません。そのため、Array 型のオブジェクトで [] を使用することはできません。

Split() の結果でインデクサーを呼び出す機能がどこから来たのか理解できないと言っています。

しかし、あなたは交換することができます

GetData(Array data)

GetData(Object[] data)

私の頭の中では同じ意味です。

于 2013-01-18T14:09:48.447 に答える