[英]C# GROUP a list of values by another list of keys
我確定這是一個愚蠢的問題,但我找不到一種簡單的方法來按另一個列表對列表進行分組。 我在互聯網上搜索了很多,但我只找到了具有 class 屬性或排序元素的示例。
我有一個帶鍵的字符串列表,例如:
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}");
}
}
如果您確實有另一個與您的keys
的順序和計數相匹配的值列表,那么您可以將代碼更改為:
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
放在我們按鍵分組的地方,但是 select 值:
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();
有多個類,例如 Tuple 或 Dictionary 可以做到這一點。 還有數據表。 這是字典的一個例子
Dictionary<string, int[]> group = new Dictionary<string, int[]>();
group.Add("a", new int []{0,1,3,6 });
group.Add("b", new int[] { 2, 7 });
group.Add("c", new int[] { 4, 5 });
像這樣按鍵查找您的組
var intArray = group.Where(x => x.Key == "a");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.