11

こんにちは、どうすればジェネリックリストからアイテムを削除できますか?コードは正しく実行しようとしていますが、どこで間違いを犯したのかわかりません; /

Users us_end = new Users();
foreach (var VARIABLE in ((List<Users>)Application["Users_On"]))
{
    if(VARIABLE.Id == (int)Session["Current_Id"])
    {
        us_end.Name = VARIABLE.Name;
        us_end.Id = VARIABLE.Id;
        us_end.Data = VARIABLE.Data;
    }
}
List<Users> us = ((List<Users>)Application["Users_On"]);
us.Remove(us_end);
Application["Users_On"] = us;
4

6 に答える 6

19

削除するには、コピーではなく、同じオブジェクトを取得する必要があります。

Users us_end;

foreach (var VARIABLE in ((List<Users>)Application["Users_On"]))
{
    if(VARIABLE.Id == (int)Session["Current_Id"])
    {
       us_end = (Users)VARIABLE;
       break;
    }
}

if (us_end != null)
{
    List<Users> us = ((List<Users>)Application["Users_On"]);
    us.Remove(us_end);
    Application["Users_On"] = us;
}

編集:

ここでアドレスを明確にするために、pstが指摘IEquatableしたように、Grooの回答のようにインターフェイスといくつかのオーバーライドを実装して機能させることもできますが、この特定のテーマではやり過ぎだと思います。これを最も一般的な方法として挙げますが、アイテムが異なるインスタンスであっても、そのような手法で異なるオブジェクトであっても、リストからアイテムを削除することも可能であることを明確にします。

参照:http://msdn.microsoft.com/en-us/library/ms131187.aspx

于 2012-06-10T18:24:26.973 に答える
9

デフォルトでは、オブジェクトの同等性は.NETで参照によって比較されます(Equalsオーバーライドされない限り、すべてのオブジェクトはから継承しますobject.Equals)。メソッドでオブジェクトを検索する場合Remove、新しいオブジェクトを渡すことはできません。

最も簡単な方法は、目的のプロパティを持つ実際のオブジェクトを見つけて、それを削除することです。

var id = (int)Session["Current_Id"];
var list = (List<Users>)Application["Users_On"];  

// find the exact item to remove.
var itemToRemove = list.FirstOrDefault(u => u.Id = id);

// if found, remove it
if (itemToRemove != null)
{
    list.Remove(itemToRemove);
}
于 2012-06-10T18:24:15.773 に答える
6

新しい オブジェクトを作成していUsersます。これは、すでに存在するオブジェクトと同じではないためApplication["Users_On"](参照が異なります)、削除されません。

Equalsこれは、および/またはIEquatable<T>でオーバーライド/実装されていないことを前提としていUsersます。

List<Users> us = ((List<Users>)Application["Users_On"]);
Users us_end = us.Where(u => u.Id == (int)Session["Current_Id"]).FirstOrDefault();
us.Remove(us_end);
Application["Users_On"] = us;

ちなみに、変数の名前付けはあまり良くありませんが、よりわかりやすい名前を使用してください。

于 2012-06-10T18:22:50.910 に答える
0

内容:

List<Users> us = ((List<Users>)Application["Users_On"]);
Users us_end = us.First(x => x.ID == (int)Session["Current_Id"]);
us.Remove(us_end);
Application["Users_On"] = us;
于 2012-06-10T18:30:00.313 に答える
0

追加のコピーではなく、removeステートメント内のアイテムを見つけて、その場で削除します。

List<Users> us = ((List<Users>)Application["Users_On"]);
us.Remove(us.FirstOrDefault(u => u.ID == (int)Session["Current_Id"]));
Application["Users_On"] = us;
于 2015-08-14T08:05:33.917 に答える
0

以前の回答で誰かが言ったように、オブジェクトの同等性は.NETの参照によって比較されます。ただし、List内の要素Tをクラスから構造体に変更するだけで、クラスと構造体の違いを活用できます。

于 2019-08-09T16:00:58.587 に答える