次のように、リストをresultlistに格納しています。
var resultlist = results.ToList();
それはこのようになります:
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
リストからID 2を削除する方法
List<T>
には2つの方法があります。
RemoveAt(int index) は、アイテムのインデックスがわかっている場合に使用できます。例えば:
resultlist.RemoveAt(1);
または Remove(T item) を使用することもできます。
var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);
あなたがその項目が本当に存在しているかわからないときは、 SingleOrDefault を使うことができます。項目がない場合、SingleOrDefault
はnull
を返します(Single
は、項目が見つからない場合に例外をスローします)。値が重複している場合は両方ともスローされます(同じid
を持つ2つの項目)。
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
resultList.Remove(itemToRemove);
resultList = results.Where(x=>x.Id != 2).ToList();
実装が簡単で、 "where not not"条件のクエリをもう少し読みやすくすることができるという、Linqの小さなヘルパーがあります。
public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
return source.Where(x=>!predicate(x));
}
//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();
短い答え:
(リストresults
から)削除する
results.RemoveAll(r => r.ID == 2);
はresults
内の ID 2 の項目を削除します(代わりに)。
フィルタする(元のリストから削除しないでresults
):
var filtered = result.Where(f => f.ID != 2);
は、 ID 2 の項目を除くすべての項目を返します。
詳細な回答:
.RemoveAll()
は非常に柔軟性があると思います。削除したい項目IDのリストがあるからです。次の例を見てください。
あなたが持っている場合:
class myClass {
public int ID; public string FirstName; public string LastName;
}
そして、以下のようにいくつかの値をresults
に割り当てました:
var results=new List<myClass> {
new myClass() { ID=1, FirstName="Bill", LastName="Smith" },
new myClass() { ID=2, FirstName="John", LastName="Wilson" },
new myClass() { ID=3, FirstName="Doug", LastName="Berg" },
new myClass() { ID=4, FirstName="Bill", LastName="Wilson" },
};
その後、削除するIDのリストを定義できます。
var removeList = new List<int>() { 2, 3 };
そして、単にこれを使ってそれらを削除します。
results.RemoveAll(r => removeList.Any(a => a==r.ID));
removeList
で指定されているように、それはアイテム2と3 を削除し、アイテム1と4を保持します。 これは適切に行われるので、追加の割り当ては必要ありません。
もちろん、次のような単一のアイテムにも使用できます。
results.RemoveAll(r => r.ID==4);
この例では、ID 4のBillを削除します。
DotNetFiddle: デモを実行します
別のアプローチがあります。 List.FindIndex
およびList.RemoveAt
を使用します。
私はおそらくKeithSによって提示されたソリューション(単純なWhere
/ToList
のみ)を使用しますが、このアプローチは、 元のリストオブジェクトを変更します。これは、期待に応じて、良い(または悪い) "機能"になります。
いずれの場合でも、FindIndex
(ガードと結合)は、IDにギャップがある場合や順序が間違っている場合など、RemoveAt
が正しいことを保証し、RemoveAt
(vs Remove
)は、secondO(n)リストの検索を回避します。
LINQPad スニペットは次のとおりです。
var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) { // ensure item found
list.RemoveAt(index);
}
list.Dump(); // results -> 1, 3
ハッピーコーディング。
より単純化された
resultList.Remove(resultList.Single(x => x.Id == 2));
新しいvarオブジェクトを作成する必要はありません。
どの種類のリストを指定するのではありませんが、ジェネリックリストはRemoveAt(index)
メソッドまたはRemove(obj)
メソッドのいずれかを使用できます。
// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);
// RemoveAt(index)
resultList.RemoveAt(1);
...あるいは、インデックスが正確にわかっていればresultlist.RemoveAt(1)
だけです。
{
class Program
{
public static List<Product> list;
static void Main(string[] args)
{
list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};
Console.WriteLine("Enter ProductID to remove");
int uno = Convert.ToInt32(Console.ReadLine());
var itemToRemove = list.Find(r => r.ProductId == uno);
if (itemToRemove != null)
list.Remove(itemToRemove);
Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
Console.WriteLine("------------sucessfully Removed---------------");
var query2 = from x in list select x;
foreach (var item in query2)
{
/*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
}
}
}
}