-3

バインディングソースインデックスのリストを並べ替え、対応するオブジェクトを配列に配置する次のメソッドがあります。私も使用してみましたがArray.Sort()、どちらも機能しません。foreachループ内のコードが呼び出されることはありません。変数int[] indicesが空でもnullでもないことをテストしました。

internal void Foo(int[] indices)
{
    var bar = new Object[indices.length];
    int i = 0;
    foreach (int index in indices.OrderBy(x => x))
    {
        // this block never gets called
        bar[i] = BindingSource[index];
        i++;
    }
}
4

2 に答える 2

0

あなたはこれを試すことができます:

var bar = indices.OrderBy(x => x).Select(x => BindingSource[x]).ToArray();

ただし、foreachの代わりにforループを使用してコードを改善できると思いますが、コードは機能するはずです。

internal void Foo(int[] indices)
{
    var bar = new Object[indices.Length];
    indices = indices.OrderBy(x => x);
    for(int i = 0; i < indices.Length; i++)
        bar[i] = BindingSource[indices[i]];    
}

もう1つ、がindices.Length等しくないことを確認する必要がある0ので、インデックスは空だと思います。

PS: C#では大文字と小文字が区別されるためindices.length、コードではindices.Length

于 2012-08-24T19:15:19.120 に答える
0

問題は、OrderBy私が想定していたように、ソートされた配列を返さなかったことです。以下は私の解決策です。

internal void Foo(int[] indices)
{
    var bar = new Object[indices.Length];
    int i = 0;
    indices = indices.OrderBy(x => x).ToArray();
    foreach (int index in indices)
    {
        // now this block gets called
        bar[i] = BindingSource[index];
        i++;
    }
}
于 2012-08-24T20:35:24.640 に答える