使用LINQ按索引对第二组列表

时间:2014-09-05 09:08:52

标签: c# linq

我想将两个列表组合在一起,但仅限于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" };

结果应该是:

    • Val A,Val A
    • Val B,Val B
  • Ç
    • Val C,Val C
  • d
    • Val D

我试过.ToLookup()但是之前从未使用过,所以我被卡住了。

如何通过使用linq来实现这一目标。

4 个答案:

答案 0 :(得分:3)

另一种选择,即不是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);

这将允许您按照它们在输入中出现的顺序遍历键,但代价是无法通过键查找。

答案 1 :(得分:2)

这应该有效:

keys.Select((k, idx) => new { k , idx })
.GroupBy(x => x.k)
.ToDictionary(g => g.Key, g => g.Select(x => values.ElementAt(x.idx));

如果将值转换为列表或数组可能会更有效,那么您可以使用 indexer 而不是ElementAt

答案 2 :(得分:-1)

IDictionary<string, IEnumerable<string>> result = 
    keys.Distinct().ToDictionary(x => x, key => values.Where(value => value.EndsWith(key)));

答案 3 :(得分:-1)

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