【问题标题】:Remove object from two list by reference通过引用从两个列表中删除对象
【发布时间】:2019-01-25 15:19:49
【问题描述】:

我列出了 2 个这样的类:

class Item1
{
}


class Item2
{
    public Item1 item;

    public Item2(Item1 it){
        item = it;
    }
}

然后我有一个包含 Item1 的列表:

List<Item1> item1list;

还有另一个包含 Item2 的列表:

List<Item2> item2list;

我的清单是这样的:

var it = new Item1();
item1list.Add(it);
item2list.Add(new Item2(it));

现在,我只想从 item1list 中删除一个元素,并在 item2list 中丢失了引用(获取 null),如下所示:

item1list.Remove(it); // item1list lost the element
item2list.Select(i => (search query)) // Gives a null result

现在 item2list 保存了我的 Item1 对象的副本。

【问题讨论】:

  • 你还有it的引用,所以应该可以找到一个项目:item2list.RemoveAll(i =&gt; i.Item1 == it) (credits)。
  • @Sinatr 还有其他可能性吗?我想避免这种情况
  • 确保你没有改变值:item = it
  • I want to lost the reference in the second list after removing from first list. 默认情况下 C# 或 LINQ 不支持。您需要编写自己的逻辑以保持列表同步。 Sinatr 建议的item2list.RemoveAll 是其中一种方法。
  • 您的第二个列表 (List&lt;Item2&gt;) 与您的第一个列表 (List&lt;Item1&gt;) 的类型不同。它包含不同的对象(您的第一个列表中的itnew Item1(),而第二个列表中的项目是new Item2(it))。我不确定在没有大量代码的情况下如何使它们保持同步。仅仅因为在第一个列表中不再引用 it 引用的对象并不意味着该对象不存在。只要有对该对象的引用(并且您的第二项(Item2 实例)引用它),该对象就会挂起而不被收集

标签: c# list linq


【解决方案1】:

我重命名了您的课程(因为我的头脑只是拒绝了一个名为“Item1”的课程)。所以,这是你原来的类,稍作修改:

class Class1 {}

class Class2 {
    public Class1 Item { get; }

    public Class2(Class1 item) {
        Item = item;
    }
}

然后是一些使用它们的代码:

 var itemList1 = new List<Class1>();
 var itemList2 = new List<Class2>();

 var item1 = new Class1();
 var item2 = new Class2(item1);

 itemList1.Add(item1);
 itemList2.Add(item2);

 //you could put this in a method and do it as a single operation:
 itemList1.Remove(item1);
 itemList2.RemoveAll(i => i.Item == item1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2021-08-03
    • 2014-06-18
    相关资源
    最近更新 更多