如何在列表中执行分组

本文关键字:执行 列表 | 更新日期: 2023-09-27 18:30:08

我有一个列表,其中包含字符串和该字符串的值,但列表包含多个同名字符串,现在我想将名称分组并在单个条目中添加该名称的值。例如

姓名。。。。。价值

apple -----  2
mango -----  4
banana ----  8
apple -----  4

现在我想添加苹果作为一个单一的条目。

如何在列表中执行分组

这可能就是您想要的:

假设你有一个这样的集合:

List<Test> fruits = new List<Test>() {   new Test() { Name="Apple", value=3 }
                                        , new Test() {Name="Apple",value=5 } 
                                        , new Test() {Name="Orange",value=5 }
                                     };

然后你可以按它分组,并将类似的项目相加,如下所示:

var netFruits= fruits.GroupBy(s => s.Name)
                     .Select(s => new Test() 
                       { 
                           Name=s.Key, 
                           value = s.Sum(b=>b.value) 
                        });

其中netFruits将有两个条目

  • 苹果8
  • Orage 5

其中Test为:

public class Test
{
    public string Name { get; set; }
    public int value { get; set; }
}

您可以像这样进行分组

yourlist.GroupBy(x=>x.YourField())

如果我认为我知道你想要的是检索不同的值。这就是它可以做的方式

        List<String> MyListOfFruit = new List<String>()
        {
            {"Banana"},
            {"Banana"},
            {"Apple"}
        };
        List<String> GroupedListOfFruits = new List<String>();
        GroupedListOfFruits.AddRange(MyListOfFruit.Distinct());
        //Now GroupedListOfFruits contains two items: Banana and Apple.

否则,发布一段代码,其中包含您所拥有的列表类型。你可能有KeyValuePair<String, int>的清单吗?

所以它们用"-----"分隔?

var groups = list.Select(str => str.Split(new[]{"-----"}, StringSplitOptions.None))
    .Select(split => new { Name = split.First(), Value = split.Last() })
    .GroupBy(x => x.Name);
foreach (var grp in groups)
{
    Console.WriteLine("Name:{0} Values:{1}", grp.Key, string.Join(",", grp.Select(x => x.Value)));
}

然而,"现在我想把苹果作为一个单独的条目添加"是什么意思还不清楚。

list.Distinct(); 

请确保您已将System.Linq包含在yr命名空间中。

由于将值与键分隔开的数字似乎是可变的,我想使用Regex进行分割更合适:

var query = yourlist.Select(x=>{
         var arr = Regex.Split(x,@"[-]+");
         return new{
            Name = arr[0],
            Value = Int32.Parse(arr[1])
         };
    })
    .GroupBy(x=>x.Name)
    .Select(x=> new{Name = x.Key, Value=x.Sum(y=>y.Value)});

通过这种方式,您将拥有一个新的匿名对象,属性Name等于字符串,属性Value等于具有该Name的元素的值之和。

相反,如果您希望返回一个值和为值的字符串,则可以将最后一个选择替换为:

     .Select(x=> x.Key + " ----- " + x.Sum(y=>y.Value).ToString());

如果您已经有一个包含名称和值字段的列表,只需删除第一个Select即可。