根据条件从列表中删除重复项

时间:2012-05-21 21:26:24

标签: c# linq c#-4.0

我有一个具有属性的项目(名称,价格)。

   Item1       $100
   Item2       $200
   Item3       $150
   Item1       $500
   Item3       $150

我想删除只有当Name存在多次且使用LINQ并且没有创建自定义比较器时价格为$ 500的项目?对于上面一个具有$ 500的item1将从列表中删除。

谢谢,

7 个答案:

答案 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();