プロパティ(名前、価格)を持つクラスItemsがあります。
Item1 $100
Item2 $200
Item3 $150
Item1 $500
Item3 $150
名前が複数回存在し、価格が 500 ドルで、LINQ を使用し、カスタム比較子を作成しない場合にのみ、アイテムを削除したいですか? $500 の上記の item1 はリストから削除されます。
ありがとう、
これを試して:
var result = items
.GroupBy(item => item.Name)
.SelectMany(g => g.Count() > 1 ? g.Where(x => x.Price != 500) : g);
名前による最初のグループ。グループに複数のアイテムがある場合は、グループから価格が 500 以外のアイテムのみを選択します。
最初に、重複を含む評価済みのサブセット リストを作成します。
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
。
var result =
from item in items
where item.Price != 500 || items.Count(i => i.Name == item.Name) == 1
select item;
重複するアイテムの検索は、次の方法で実行できます。
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();
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
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
var Test = (from row in DataTable.AsEnumerable()
select row.Field<string>("ColumnName")).Distinct();