如何按列表执行分组

时间:2013-09-03 07:37:57

标签: c# linq

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

姓名.....价值

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

现在我想将苹果添加为单个条目。

6 个答案:

答案 0 :(得分:1)

可能这就是你想要的:

假设您有这样的集合:

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将有两个条目

  • Apple 8
  • Orage 5

其中Test是:

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

答案 1 :(得分:0)

您可以像这样进行分组

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

答案 2 :(得分:0)

所以他们与"-----"分开?

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

然而,目前尚不清楚您的意思是“现在我想将苹果添加为单一条目”。

答案 3 :(得分:0)

如果我认为我知道你想要什么,那就是重新审视这些值。这是怎么做的

        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>列表吗?

答案 4 :(得分:0)

由于 - 将值与键分开的数量似乎是可变的,我猜使用正则表达式进行拆分更合适:

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

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

答案 5 :(得分:0)

list.Distinct(); 

确保您在yr名称空间中包含了System.Linq。