1

LINQ を使用して行っていることをより効率的に行う方法があるかどうかはわかりません... 2 つの列挙があります。

enumA(string): { "Andy", "Bill", "Charlie", "Doug" }
enumB(foo): { "Doug", "Edward", "George", "Bill" }(enumB には実際にオブジェクトが含まれていることに注意してください)

var dictionary = new Dictionary<string, 
foreach (var a in enumA)
{
    var b = enumB.SingleOrDefault(x => String.Equals(x.ToString(), a));

    if (b != null)
        dictionary[a] = b;
}

LINQを使用して辞書を作成するためのより「正しい」方法がおそらくあると確信しているときに、enumBを何度も列挙してこの方法で辞書を作成するのは、私には悪いようです。

4

4 に答える 4

3

を使って効率的に行うことができます。

join

ToDictionairy

後で電話。

        var listA = "abcd";
        var listB = "cdef";

        var tuples = from charFromA in listA
                    join charFromB in listB
                    on charFromA.ToString() equals charFromB.ToString() // instead of ToString(), do something complex
                    select new { A = charFromA, B = charFromB };

        var dictionairy = tuples.ToDictionary(keySelector: t => t.A,elementSelector: t => t.B);
于 2012-11-16T19:46:46.993 に答える
1
var query = from b in enumB.Where(x => x != null)
            join a in enumA on b.ToString() equals a
            select new { a, b };
var dictionary = query.ToDictionary(x => x.a, x => x.b);

または流暢な API を使用する場合:

var dictionary = enumB.Where(b => b != null)
                      .Join(enumA, 
                            b => b.ToString(), 
                            a => a, 
                            (b, a) => new { a, b })
                      .ToDictionary(x => x.a, x => x.b);
于 2012-11-16T19:55:03.510 に答える
0
var dictionary = enumA
    .Join(enumB, a => a, b => b.ToString(), (a, b) => new { A = a, B = b })
    .ToDictionary(i => i.A, i => i.B);

重複するキーがある場合、これは例外をスローするため、次を使用できます。

var dictionary = enumA
    .Join(enumB, a => a, b => b.ToString(), (a, b) => new { A = a, B = b })
    .Aggregate(new Dictionary<string, Foo>(), (dict, i) => {
        dict[i.A] = i.B;
        return dict;
    });

最後に一致した値を保持します。

于 2012-11-16T19:56:27.087 に答える
0
var dict = enumA.Join(enumB, a => a, b => b, (a, b) => new {a, b})
                .GroupBy(x => x.a)
                .ToDictionary(x => x.Key, x => x.First());

GroupBy は、enumB の重複の可能性を排除することです。

enumB の重複が存在しない場合は、単純化して

var dict = enumA.Join(enumB, a => a, b => b, (a, b) => new {a, b})
                .ToDictionary(x => x.a, x => x.b);
于 2012-11-16T20:02:01.060 に答える