作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
也许我遗漏了一些微不足道的东西。我有几个 List<T>
s 和我需要他们提供的一个大列表,它是所有其他列表的联合。但我确实希望在那个大列表中引用他们,而不仅仅是值/副本(不像我通常在 SO 上找到的许多问题)。
例如我有这个,
List<string> list1 = new List<string> { "a", "b", "c" };
List<string> list2 = new List<string> { "1", "2", "3" };
var unionList = GetThatList(list1, list2);
假设我在 unionList
中得到了我想要的列表,那么这应该发生:
unionList.Remove("a"); => list1.Remove("a");
unionList.Remove("1"); => list2.Remove("1");
//in other words
//
//unionList.Count = 4;
//list1.Count = 2;
//list2.Count = 2;
为了清楚起见,这通常发生在
unionList = list1; //got the reference copy.
但是我该如何处理第二个列表,list2
添加到 unionList
?
我试过了 Add
和 AddRange
但他们显然是克隆而不是复制。
unionList = list1;
unionList.AddRange(list2); //-- error, clones, not copies here.
和
foreach (var item in list2)
{
unionList.Add(item); //-- error, clones, not copies here.
}
更新:我想我问的是一些没有意义的东西,而且是语言本身不可能的东西..
最佳答案
我认为不存在任何此类。您可以自己实现。这是一个开始:
class CombinedLists<T> : IEnumerable<T> // Add more interfaces here.
// Maybe IList<T>, but how should it work?
{
private List<List<T>> lists = new List<List<T>>();
public void AddList(List<T> list)
{
lists.Add(list);
}
public IEnumerator<T> GetEnumerator()
{
return lists.SelectMany(x => x).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public bool Remove(T t)
{
foreach (List<T> list in lists)
{
if (list.Remove(t)) { return true; }
}
return false;
}
// Implement the other methods.
}
下面是一些您可以用来测试它的代码:
List<string> list1 = new List<string> { "a", "b", "c" };
List<string> list2 = new List<string> { "1", "2", "3" };
CombinedLists<string> c = new CombinedLists<string>();
c.AddList(list1);
c.AddList(list2);
c.Remove("a");
c.Remove("1");
foreach (var x in c) { Console.WriteLine(x); }
Console.WriteLine(list1.Count);
Console.WriteLine(list2.Count);
删除项目相当简单。但是如果您尝试将项目插入组合列表中,您可能会遇到问题。哪个列表应该接收插入的项目并不总是明确定义的。例如,如果您有一个包含两个空列表的组合列表,并且您在索引 0 处插入了一个项目,那么该项目应该添加到第一个还是第二个空列表?
关于c# - 如何在不克隆的情况下复制 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11705146/
我是一名优秀的程序员,十分优秀!