使用LINQ按索引将两个列表分组
本文关键字:两个 列表 LINQ 索引 使用 | 更新日期: 2023-09-27 18:20:55
我想将两个列表组合在一起,但只能使用linq语句。没有额外的变量或循环。
IEnumerable<string> keys = new List<string>() { "A", "B", "C", "A", "B", "C", "D" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C", "Val A", "Val B", "Val C", "Val D" };
结果应该是:
- A
- Val A、Val A
- B
- Val B、Val B
- C
- Val C、Val C
- D
- Val D
我试过ToLookup(),但我以前从未用过,所以我被卡住了。
如何通过使用linq来实现这一点。
另一种选择,不是O(n^2):
var grouped = keys
.Zip(values, (k, v) => new { k, v })
.GroupBy(kvp => kvp.k)
.ToDictionary(g => g.Key, g => g.Select(kvp => kvp.v));
请注意,字典不会保留关键字的顺序;如果你愿意,你可以使用这个:
var grouped = keys
.Zip(values, (k, v) => new { k, v })
.GroupBy(kvp => kvp.k, kvp => kvp.v);
这将允许您按照键在输入中出现的顺序迭代键,代价是无法通过键查找。
这应该有效:
keys.Select((k, idx) => new { k , idx })
.GroupBy(x => x.k)
.ToDictionary(g => g.Key, g => g.Select(x => values.ElementAt(x.idx));
如果将值转换为列表或数组,则可以使用索引器而不是ElementAt
。
IDictionary<string, IEnumerable<string>> result =
keys.Distinct().ToDictionary(x => x, key => values.Where(value => value.EndsWith(key)));
IEnumerable<string> keys = new List<string>() { "A", "B", "C", "A", "B", "C", "D" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C", "Val A", "Val B", "Val C", "Val D" };
var x = from string key in keys
join string val in values on key equals val.Substring(val.Length - 1, 1)
select new
{
key,
val
};