提问者:小点点

C#将一个值列表按另一个键列表分组


我肯定这是一个愚蠢的问题,但我找不到一个简单的方法将一个列表按另一个列表分组。我在网上搜索了很多,但我只找到了带有类属性或排序元素的示例。

我有一个带有键的字符串列表,例如:

List<string> keys = new List<string>();
keys.Add("a");
keys.Add("a");
keys.Add("b");
keys.Add("a");
keys.Add("c");
keys.Add("c");
keys.Add("a");
keys.Add("b");

和一个我想按键列表分组的int列表,例如:

List<int> vals = new List<int>();
vals.Add(10);
vals.Add(11);
vals.Add(12);
vals.Add(13);
vals.Add(14);
vals.Add(15);
vals.Add(16);
vals.Add(17);

因此结果应该是一个包含子列表的列表,如下所示:

{{10,11,13,16},{12,17},{14,15}}

或者也可以得到指数。提前道谢。


共2个答案

匿名用户

看起来您希望获取按值分组的元素的索引。这就是使用LINQ的方法:

List<string> keys = new List<string>();
keys.Add("a");
keys.Add("a");
keys.Add("b");
keys.Add("a");
keys.Add("c");
keys.Add("c");
keys.Add("a");
keys.Add("b");

var grouped = keys.Select((val, index) => (val, index))
    .GroupBy(x => x.val, x => x.index)
    .ToList();

foreach (var g in grouped)
{
    Console.WriteLine($"{g.Key}: ");
    foreach (var val in g)
    {
        Console.WriteLine($"  {val}");
    }
}

如果您确实有另一个与的顺序和计数匹配的值列表,那么您可以将代码更改为:

List<string> keys = new List<string>();
keys.Add("a");
keys.Add("a");
keys.Add("b");
keys.Add("a");
keys.Add("c");
keys.Add("c");
keys.Add("a");
keys.Add("b");

List<int> vals = new List<int>();
vals.Add(0);
vals.Add(1);
vals.Add(2);
vals.Add(3);
vals.Add(4);
vals.Add(5);
vals.Add(6);
vals.Add(7);

var grouped = keys.Select((val, index) => (val, index))
    .GroupBy(x => x.val, x => vals[x.index])
    .ToList();

匿名用户

您可以尝试zip以建立键/值对应关系(第n个键对应第n个值),即。

"a" corresponds to 0
"a" corresponds to 1
"b" corresponds to 2
...
"b" corresponds to 7

然后将groupby放在按键分组的位置,但选择value:

using System.Linq;

...

var result = keys
  .Zip(vals, (k, v) => new {k, v})
  .GroupBy(pair => pair.k, pair => pair.v)
  .Select(group => group.ToList())
  .ToList();