我肯定这是一个愚蠢的问题,但我找不到一个简单的方法将一个列表按另一个列表分组。我在网上搜索了很多,但我只找到了带有类属性或排序元素的示例。
我有一个带有键的字符串列表,例如:
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}}
或者也可以得到指数。提前道谢。
看起来您希望获取按值分组的元素的索引。这就是使用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();