【问题标题】:C# GROUP a list of values by another list of keysC# 按另一个键列表对值列表进行分组
【发布时间】:2021-06-12 20:08:20
【问题描述】:

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

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

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");

还有一个我想按key列表分组的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}}

或者也可以获取索引。 提前致谢。

【问题讨论】:

  • 你能和我们分享你的代码吗?
  • 所以实际上valskeys 元素的索引,可以删除。您想按值分组并获取分组元素的索引。
  • 这能回答你的问题吗? can I sort a list based on another list in C#
  • Zip 将这 2 个集合合并为一个 List&lt;CustomObject&gt;class CustomObject{ string Key{get;set;} int Value{get;set;} }。然后使用简单的GroupBy
  • 艾米,代码很复杂,我正在使用特定的技术软件 (Revit)。我简化了我的“问题”。 Jacek,vals 是我要分组的元素。自我,我不想为这个临时的分组任务创建另一个类。分组后,键列表将被丢弃。

标签: c# group-by


【解决方案1】:

看起来您想获取按值分组的元素的索引。这就是你使用 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();

【讨论】:

  • 这正是我想要的。太感谢了。我知道 LINQ 对你来说很简单,但我对此很陌生。
【解决方案2】:

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

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

然后把GroupBy放在我们按键分组的地方,但是选择值:

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();

【讨论】:

    【解决方案3】:

    有多个类,例如 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");
    

    【讨论】:

    • 像这样按关键字查找您的组 group.Where(x =&gt; x.Key == "a"); ?? Chotto matte kudasai...group["A"]这就是您访问值的方式.. IEnumerable 在哪里没有意义。读到这里,我的心猛地一跳。 .供参考所以问题How to get dictionary value by key?
    • 很公平,你添加了它......你的心现在可以休息了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多