2012-11-16 25 views
1

我不知道是否有做什麼我使用LINQ做的更有效的方法......我有兩個枚舉:更好的方法來做我需要做的事情使用LINQ?

enumA(串):{ "Andy", "Bill", "Charlie", "Doug" }
enumB(富):{ "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; 
} 

這似乎只是對我不好給enumB一遍遍枚舉和創建字典這樣,當我敢肯定,有可能是一個更「正確」使用LINQ創建字典的方法。

回答

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); 
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); 
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; 
    }); 

這將保持最後的匹配值。

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); 
相關問題