我有一个具有属性的项目(名称,价格)。
Item1 $100
Item2 $200
Item3 $150
Item1 $500
Item3 $150
我想删除只有当Name存在多次且使用LINQ并且没有创建自定义比较器时价格为$ 500的项目?对于上面一个具有$ 500的item1将从列表中删除。
谢谢,
答案 0 :(得分:8)
试试这个:
var result = items
.GroupBy(item => item.Name)
.SelectMany(g => g.Count() > 1 ? g.Where(x => x.Price != 500) : g);
第一组名称。如果该组具有多个项目,请仅选择价格不是500的组中的项目。
答案 1 :(得分:4)
var result =
from item in items
where item.Price != 500 || items.Count(i => i.Name == item.Name) == 1
select item;
答案 2 :(得分:3)
我首先要创建一个包含重复项的预先评估的子集列表:
var dupes = list.Where(a => list.Count(b => b.Name.Equals(a.Name)) > 1).ToList();
.ToList()
确保此查询仅评估一次。如果列表很大,这将在速度上产生巨大的差异。
现在,如果您的列表是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
时,将对此进行评估。
答案 3 :(得分:2)
查找重复的项目可以通过以下方式完成:
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();
答案 4 :(得分:1)
var result = from np in NamePriceCollection
where NamePriceCollection.Count(x => x.Name == np.Name) > 1 && np.Price == 500
select np;
//这里有您指定条件的项目列表。从基础集合中删除它们
答案 5 :(得分:0)
我想仅在名称存在多次且价格为$ 500
时才删除项目
Apple 300 <-- winner
Apple 500 <-- dupe
Banana 500 <-- winner
Banana 500 <-- dupe
Banana 500 <-- dupe
Cantelope 100 <-- winner
Cantelope 200 <-- winner
第二个苹果显然是一个骗子。香蕉有三个项目,价格== 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
答案 6 :(得分:-2)
var Test = (from row in DataTable.AsEnumerable()
select row.Field<string>("ColumnName")).Distinct();