我有一个列表,其中包含字符串和该字符串的值,但列表包含多个同名字符串,现在我想对名称进行分组并在单个条目中添加该名称的值。例如
名称.....值
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 }
};
然后你可以 groupBy 它并总结类似的项目,如下所示:
var netFruits= fruits.GroupBy(s => s.Name)
.Select(s => new Test()
{
Name=s.Key,
value = s.Sum(b=>b.value)
});
其中 netFruits 将有两个条目
哪里Test
是:
public class Test
{
public string Name { get; set; }
public int value { get; set; }
}
你可以这样做 groupby 像这样
yourlist.GroupBy(x=>x.YourField())
由于 - 将值与键分开的数量似乎是可变的,我想使用正则表达式进行拆分更合适:
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 等于具有该名称的元素的值之和。
相反,如果您希望返回一个将值的总和作为值的字符串,则可以将最后一个选择替换为:
.Select(x=> x.Key + " ----- " + x.Sum(y=>y.Value).ToString());
如果,您已经有一个包含名称和值字段的列表,只需删除第一个 Select。
如果我认为我知道您想要的是检索不同的值。这就是它可以做到的
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>
可能的清单吗?
list.Distinct();
确保您已将 System.Linq 包含在 yr 命名空间中。
所以他们是分开的"-----"
?
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)));
}
但是,尚不清楚“现在我想将苹果添加为单个条目”是什么意思。