如何在列表中执行分组
本文关键字:执行 列表 | 更新日期: 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即可。