6

プロパティ(名前、価格)を持つクラスItemsがあります。

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

名前が複数回存在し、価格が 500 ドルで、LINQ を使用し、カスタム比較子を作成しない場合にのみ、アイテムを削除したいですか? $500 の上記の item1 はリストから削除されます。

ありがとう、

4

7 に答える 7

8

これを試して:

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

名前による最初のグループ。グループに複数のアイテムがある場合は、グループから価格が 500 以外のアイテムのみを選択します。

于 2012-05-21T21:57:23.140 に答える
4

最初に、重複を含む評価済みのサブセット リストを作成します。

var dupes = list.Where(a => list.Count(b => b.Name.Equals(a.Name)) > 1).ToList();

.ToList()このクエリが 1 回だけ評価されるようにします。リストが大きい場合、これは速度に大きな違いをもたらします。

リストが の場合、次のメソッド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 に答える
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 に答える
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の削除は、以下の方法を使用して実行できます。

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

2 番目の Apple は明らかにだまされています。Banana には、価格 == 500 のアイテムが 3 つあります。そのうちの 1 つが勝者です。残りはだまされています。価格はありません == 500 カンテロープなので、だまされず、勝者だけです。

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 に答える