更好的方法来做我需要做的事情使用LINQ?
问题描述:
我不知道是否有做什么我使用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创建字典的方法。
答
您可以使用
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);
答
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);
答
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;
});
这将保持最后的匹配值。
答
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);