【问题标题】:Is there a way to replace an object which is referenced in multiple lists with a new instance easily?有没有办法用新实例轻松替换多个列表中引用的对象?
【发布时间】:2025-12-27 15:50:11
【问题描述】:

我想用匹配接口类的新实例替换在多个列表中引用的对象。

这是一个更好地理解问题的示例。

  1. 有一个接口叫IPosition
  2. 有两个类实现了该接口:RealPositionAccessiblePosition
  3. 在我的算法中,我收到了一组 IPosition 列表,如下所示:List<IPosition>[],基本上是多个列表
  4. 列表引用对象的相同实例是很常见的。这是一个可视化:
  5. 现在我想创建new 类的new 实例并更新所有列表中的所有引用。

有没有办法轻松做到这一点?

非常感谢!

【问题讨论】:

  • 获取每个列表,查找,使用找到的索引替换。容易。

标签: c# .net list reference


【解决方案1】:

您可以为您的数据创建一个容器。

public interface IContainer<T>
{
    T Data { get; set; }
}

还有一个List&lt;IContainer&lt;IPosition&gt;&gt;

现在您可以更改容器的Data,而不是更改项目引用。

【讨论】:

  • 你能举个例子吗?我将如何使用此解决方案和我的列表数组?你的意思是有一个List&lt;IContainer&lt;IPosition&gt;&gt;[]。那么基本上是这些列表的数组?
【解决方案2】:

您可以遍历列表并比较项目。

public interface IPosition
{
    int ID { get; set; }
}

public class RealPosition : IPosition
{
    public int ID { get; set; }
}

public class AccessiblePosition : IPosition
{
    public int ID { get; set; }
}

void Main()
{
    var toReplace = new RealPosition { ID = 1 };        
    var list1 = new List<IPosition>
    {
        toReplace,
        new RealPosition { ID = 2 },
        new RealPosition { ID = 3 },
    };
    var list2 = new List<IPosition>
    {
        toReplace,
        new RealPosition { ID = 4 },
        new RealPosition { ID = 5 },
    };
    var listOfLists = new List<List<IPosition>>{ list1, list2 };
    var replacement = new AccessiblePosition{ ID = 42 };

    foreach(var list in listOfLists)
    {
        //must use for here
        for(int i = 0; i < list.Count; ++i)
        {
            if(list[i] == toReplace)
            {                       
                list[i] = replacement;
            }
        }
    }
}

【讨论】:

  • 非常感谢@Greg!我想到了这个,这正是我想要避免的。原因是我有数千个列表,我需要一个运行时优化的解决方案。
最近更新 更多