4

特定のフィールド (employeeID) が別のリストの特定のフィールド [0,0] と等しい、異なるオブジェクトの 2 つのリストをマージしようとしています。私のコードは次のようになります。

int i = Users.Count() - 1;
int i2 = oracleQuery.Count() - 1;
for (int c = 0; c <= i; c++)
{
    for (int d = 0; d <= i2; d++)
    {
        if (Users[c].getEmployeeID().ToString() == oracleQuery[d][0,0].ToString())
        {
            Users[c].setIDMStatus(oracleQuery[d][0,1].ToString());
        }
    }
}

これは機能します...しかし、効率的ではないようです。最終的に oracleQuery リストからの新しい情報を含むユーザー リストにつながる、より効率的なコードの提案はありますか?

4

3 に答える 3

6

Enumerable.Joinで結合を使用できます。

var matches = Users.Join(oracleQuery, 
                         u => u.getEmployeeId().ToString(), 
                         oq => oq[0,0].ToString(), 
                         (u,oc) => new { User = u, Status = oc[0,1].ToString() });

foreach(var match in matches)
    match.User.setIDMStatus(match.Status);

と oracleQuery の要素が同じ型であるToString()場合は、呼び出しを削除できることに注意してください。getEmployeeId()[0,0]

于 2013-09-20T20:33:50.407 に答える
1

効率に関して私が気付いた唯一のことは、Enumerable.Count() メソッドを使用していることです。このメソッドは、for ループで明示的に再度ループする前に結果を列挙します。LINQ の実装では、要素をカウントするために結果を通過するパスが取り除かれると思います。

LINQ QUERY EXPRESSIONSの使用についてあなたがどのように感じているかはわかりませんが、これが私が一番気に入っていることです。

var matched = from user in Users
              join item in oracleQuery on user.getEmployeeID().ToString() equals item[0,0].ToString()
              select new {user = user, IDMStatus = item[0,1] };

foreach (var pair in matched) 
{
     pair.user.setIDMStatus(pair.IDMStatus);
}

ネストされた foreach ループを使用することもできます (複数の一致があり、set が複数回呼び出される場合)。

foreach (var user in Users) 
{
     foreach (var match in oracleQuery.Where(item => user.getEmployeeID().ToString() == item[0,0].ToString()) {
         user.setIDMStatus(match[0,1]);
     }
}

または、確実に一致するものが 1 つしかない場合:

foreach (var user in Users) 
{
    var match = oracleQuery.SingleOrDefault(item => user.getEmployeeID().ToString() == item[0,0].ToString()); 
    if (match != null) {
        user.setIDMStatus(match[0,1]);
    }
}

あなたが書いたものに実際の効率上の問題があるとは思いませんが、LINQ の実装に対してベンチマークすることができます。foreachorを使うとLinq query expressionコードが読みやすくなると思いますが、効率的には問題ないと思います。別の回答で行われたように、LINQ メソッド構文を使用して LINQ クエリ式を記述することもできます。

于 2013-09-20T20:52:15.847 に答える
0

データがデータベースからのものである場合は、そこで結合できます。それ以外の場合は、2 つのリストを並べ替えて、現在よりも高速なマージ結合を実行できます。

ただし、C# で LINQ が導入されて以来、コードでこれを行う方法はたくさんあります。linq を使用してリストを結合/マージするだけです。

于 2013-09-20T20:36:54.630 に答える