簡體   English   中英

C# 按另一個鍵列表對值列表進行分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM