我有一个具有属性(名称,价格)的类项目。
Item1 $100
Item2 $200
Item3 $150
Item1 $500
Item3 $150
我只想在名称存在多次且价格为 500 美元(使用 LINQ 且不创建自定义比较器)时删除项目?对于上述 500 美元的项目 1,将从列表中删除。
谢谢,
试试这个:
var result = items
.GroupBy(item => item.Name)
.SelectMany(g => g.Count() > 1 ? g.Where(x => x.Price != 500) : g);
第一组按名称。如果该组的商品超过 1 件,则仅选择该组中价格不为 500 的商品。
var result =
from item in items
where item.Price != 500 || items.Count(i => i.Name == item.Name) == 1
select item;
我将首先创建一个包含重复项的预评估子集列表:
var dupes = list.Where(a => list.Count(b => b.Name.Equals(a.Name)) > 1).ToList();
.ToList()
确保此查询仅评估一次。如果列表很大,这将在速度上产生巨大差异。
现在,如果您的列表是 a List<>
,您可以使用以下RemoveAll()
方法:
list.RemoveAll(item => item.Price == 500 && dupes.Contains(item));
你完成了。
但是如果您的列表只知道是IEnumerable<>
,或者您不想修改源列表,或者您想要延迟执行,那么只需使用 LINQ:
var result = list.Where(item => !(item.Price == 500 && dupes.Contains(item)));
这将在您枚举时进行评估result
。
查找重复项可以通过以下方式完成:
var dups = lst.Where(x=>lst.Any(y => y != x && y.Name == x.Name))
500
可以通过以下方式查找具有价格的重复项目:
var dups500 = dups.Where(x=>x.Price == 500);
最后删除 dups500 可以使用 except 方法:
var result = lst.Except(dup);
或多合一:
var result =
lst.Except(
lst
.Where(x=>x.Price == 500 &&
lst.Any(y => y != x && y.Name == x.Name))).ToList();
var result = from np in NamePriceCollection
where NamePriceCollection.Count(x => x.Name == np.Name) > 1 && np.Price == 500
select np;
// 这里有指定条件的项目列表。从基础集合中删除它们
仅当名称存在多次且价格为 500 美元时,我才想删除项目
Apple 300 <-- winner
Apple 500 <-- dupe
Banana 500 <-- winner
Banana 500 <-- dupe
Banana 500 <-- dupe
Cantelope 100 <-- winner
Cantelope 200 <-- winner
显然,第二个苹果是骗子。Banana 有三件商品,价格 == 500。一件是赢家。其余的都是骗子。没有价格 == 500 Cantelopes,所以没有骗子,只有赢家。
from item in source
group item by item.Name into g
let okItems = g.Where(x => x.Price != 500)
let secondChoiceItem = g.FirstOrDefault(x => x.Price == 500)
let theItems = okItems.DefaultIfEmpty(secondChoiceItem)
from nonDupeItem in theItems
select nonDupeItem
var Test = (from row in DataTable.AsEnumerable()
select row.Field<string>("ColumnName")).Distinct();