6

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

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

我只想在名称存在多次且价格为 500 美元(使用 LINQ 且不创建自定义比较器)时删除项目?对于上述 500 美元的项目 1,将从列表中删除。

谢谢,

4

7 回答 7

8

试试这个:

var result = items
    .GroupBy(item => item.Name)
    .SelectMany(g => g.Count() > 1 ? g.Where(x => x.Price != 500) : g);

第一组按名称。如果该组的商品超过 1 件,则仅选择该组中价格不为 500 的商品。

于 2012-05-21T21:57:23.140 回答
4
var result =
    from item in items
    where item.Price != 500 || items.Count(i => i.Name == item.Name) == 1
    select item;
于 2012-05-21T22:09:29.253 回答
4

我将首先创建一个包含重复项的预评估子集列表:

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

于 2012-05-21T22:39:03.427 回答
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();
于 2012-05-21T21:32:06.090 回答
1
var result = from np in NamePriceCollection
where NamePriceCollection.Count(x => x.Name == np.Name) > 1 && np.Price == 500
select np;

// 这里有指定条件的项目列表。从基础集合中删除它们

于 2012-05-21T21:33:07.057 回答
0

仅当名称存在多次且价格为 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
于 2012-05-22T00:22:19.040 回答
-2
var Test = (from row in DataTable.AsEnumerable()
            select row.Field<string>("ColumnName")).Distinct();
于 2012-09-17T16:58:06.017 回答