我想比较一个对象列表的元素,删除重复的Item并增加该Item的数量(C#代码),我不知道我是否应该使用LinQ,For或foreach声明:我有一个OrderItem列表我想删除具有相同FK_ArtikelId的OrderItem并增加OrderItem的Qantity。 Exp:
for (int i=1 ; i < lot.Count ; i ++)
{
for (j = i + 1; j <= lot.Count; j++)
{
if (lot[i].FK_ArticleId.Equals(lot[j].FK_ArticleId))
{
lot[i].Quantity += lot[j].Quantity;
lot.Remove(lot[j]);
}
}
}
答案 0 :(得分:1)
您必须使用GroupBy linq方法并处理结果组:给定类
public class Article
{
public int FK_ArticleId { get; set; }
public int Quantity { get; set; }
}
以及以下列表:
var list = new List<Article>()
{
new Article() {FK_ArticleId = 1, Quantity = 10}
, new Article() {FK_ArticleId = 1, Quantity = 10}
, new Article() {FK_ArticleId = 1, Quantity = 10}
, new Article() {FK_ArticleId = 2, Quantity = 100}
, new Article() {FK_ArticleId = 2, Quantity = 100}
, new Article() {FK_ArticleId = 3, Quantity = 1000}
};
以下linq查询返回您需要的内容:
list.GroupBy(a => a.FK_ArticleId)
.Select(g => new Article() {FK_ArticleId = g.Key, Quantity = g.Sum(a => a.Quantity)});
// article id 1, quantity 30
// article id 2, quantity 200
// article id 3, quantity 1000
如果您不想创建新文章,可以获取结果组中的第一个,并将其Quantity
设置为正确的值:
var results = list.GroupBy(a => a.FK_ArticleId)
.Select(g =>
{
var firstArticleOfGroup = g.First();
firstArticleOfGroup.Quantity = g.Sum(a => a.Quantity);
return firstArticleOfGroup;
});
答案 1 :(得分:0)
我没有测试,但这应该让你知道linq的力量......
var stuff = lot
.GroupBy(p => p.FK_ArticleId)
.Select(g => g)
.ToList();
这应该为您提供一组articleID,您可以轻松获取计数,创建新的合并列表等。
答案 2 :(得分:0)
对于初学者,您无法使用foreach
,因为您正在修改列表,而Enumerator
会抛出异常。您可以使用Linq执行以下操作:
var grouped = lot.GroupBy(x => x.FK_ArticleId).ToArray();
foreach(var group in grouped)
{
group.First().Quantity = group.Sum(item => item.Quantity);
}
现在,每个组中的第一项将包含具有相同FK_ArticleId
的所有项目数量的总和。现在,要获得结果,请使用:
var results = grouped.Select(g => g.First());
此时,您纯粹决定是将结果作为单独的集合返回还是将其插入原始列表中。如果您选择第二种方法,请不要忘记先清除列表:
list.Clear();
list.AddRange(results);
修改强>
将Quantity
属性累积到每个组的第一项中的更优雅的解决方案如下:
data.GroupBy(x=>x.FK_ArticleId)
.Select(g => g.Aggregate((acc, item) =>
{
acc.Quantity = item.Quantity;
return acc;
}));
这是我在LinqPad中取消的内容: