将两个列表连接在一起

Gur*_*epS 307 c#

如果我有两个类型字符串列表(或任何其他类型),加入这两个列表的快速方法是什么?

订单应该保持不变.应删除重复项(尽管两个链接中的每个项都是唯一的).我在google搜索时并没有发现太多,并且不想实现任何.NET接口以提高传输速度.

Chr*_*isF 528

你可以尝试:

List<string> a = new List<string>();
List<string> b = new List<string>();

a.AddRange(b);
Run Code Online (Sandbox Code Playgroud)

MSDN页面 AddRange

这样可以保留列表的顺序,但不会删除任何重复的列表Union.

这确实改变了清单a.如果你想保留原始列表,那么你应该使用Concat(如其他答案中所指出的):

var newList = a.Concat(b);
Run Code Online (Sandbox Code Playgroud)

IEnumerable只要a不为null ,就返回一个.

  • 没有人真正进入何时使用哪种方法.AddRange在适当的位置编辑一个列表,向其中添加第二个列表(就像你多次调用.Add(foo)一样).Concat和Union扩展方法不会更改原始列表.他们懒惰地构建一个新的IEnumerable,除非必要,否则甚至不会访问原始列表成员.如上所述,Union会删除重复项,而其他项则不会. (25认同)
  • 当其中一个列表为null时,`concat`不起作用 (8认同)
  • 有谁知道这种方法的复杂性是什么?(很遗憾微软不会将这些重要信息作为其MSDN的一部分提供) (4认同)
  • 我建议您检查一下他对各种方法的比较。还显示了各种选项的性能分析:[合并集合](https://alicebobandmallory.com/articles/2012/10/18/merge-collections-without-duplicates-in-c) (2认同)

Jar*_*Par 104

空间开销最小的方法是使用Concat扩展方法.

var combined = list1.Concat(list2);
Run Code Online (Sandbox Code Playgroud)

它创建一个实例IEnumerable<T>,它将按顺序枚举list1和list2的元素.

  • 记住要使用System.Linq;才能使用Concat (2认同)

Lar*_*nal 41

联盟的方法可能会满足您的需求.您没有指定订单或重复项是否重要.

拿两个IEnumerables并执行一个联合,如下所示:

int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

// yields { 5, 3, 9, 7, 8, 6, 4, 1, 0 } 
Run Code Online (Sandbox Code Playgroud)


Fre*_*els 24

像这样的东西:

firstList.AddRange (secondList);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用System.Linq中定义的"Union"扩展方法.使用"联合",您还可以指定比较器,该比较器可用于指定项目是否应该联合.

像这样:

List<int> one = new List<int> { 1, 2, 3, 4, 5 };
List<int> second=new List<int> { 1, 2, 5, 6 };

var result = one.Union (second, new EqComparer ());

foreach( int x in result )
{
    Console.WriteLine (x);
}
Console.ReadLine ();

#region IEqualityComparer<int> Members
public class EqComparer : IEqualityComparer<int>
{
    public bool Equals( int x, int y )
    {
        return x == y;
    }

    public int GetHashCode( int obj )
    {
        return obj.GetHashCode ();
    }
}
#endregion
Run Code Online (Sandbox Code Playgroud)


Bal*_*i M 16

targetList = list1.Concat(list2).ToList();
Run Code Online (Sandbox Code Playgroud)

我认为这样做很好.如前所述,Concat返回一个新序列,在将结果转换为List时,它可以完美地完成工作.使用AddRange方法时,隐式转换有时可能会失败.


jim*_*zer 13

如果两个列表中都存在某些项目,您可以使用

var all = list1.Concat(list2).Concat(list3) ... Concat(listN).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)


Bad*_*aro 7

只要它们属于同一类型,使用AddRange就非常简单:

list2.AddRange(list1);
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 7

var bigList = new List<int> { 1, 2, 3 }
    .Concat(new List<int> { 4, 5, 6 })
    .ToList(); /// yields { 1, 2, 3, 4, 5, 6 }
Run Code Online (Sandbox Code Playgroud)