join两个列表

如果我有两个stringtypes(或任何其他types)的列表,join这两个列表的快捷方式是什么?

订单应该保持不变。 应删除重复项目(尽pipe两个链接中的每个项目都是唯一的)。 在Google上search的时候,我没有发现太多的东西,也不想为了交付速度而实现任何.NET接口。

你可以尝试:

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

AddRange MSDN页面

这保留了列表的顺序,但是并没有删除Union会做的任何重复。

这确实改变了名单。 如果你想保留原来的列表,那么你应该使用Concat (正如在其他答案中指出的那样):

 var newList = a.Concat(b); 

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

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

 var combined = list1.Concat(list2); 

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

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

以两个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 } 

像这样的东西:

 firstList.AddRange (secondList); 

或者,您可以使用System.Linq中定义的“联合”扩展方法。 使用'联合',你也可以指定一个比较器,它可以用来指定一个项目是否应该联合。

喜欢这个:

 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 

如果您可以使用这两个列表中的某个项目

 var all = list1.Concat(list2).Concat(list3) ... Concat(listN).Distinct().ToList(); 
 targetList = list1.Concat(list2).ToList(); 

我认为这很好。 如前所述,Concat返回一个新的序列,并将结果转换为List,它完美地完成了这项工作。 当使用AddRange方法时,隐式转换可能会失败。

只要它们属于同一types,AddRange就非常简单:

 list2.AddRange(list1); 

AddRange方法

 aList.AddRange( anotherList ); 
 var bigList = new List<int> { 1, 2, 3 } .Concat(new List<int> { 4, 5, 6 }) .ToList(); /// yields { 1, 2, 3, 4, 5, 6 } 
 List<string> list1 = new List<string>(); list1.Add("dot"); list1.Add("net"); List<string> list2 = new List<string>(); list2.Add("pearls"); list2.Add("!"); var result = list1.Concat(list2); 

一种方式:List.AddRange()取决于types?

看到这个链接

 public class ProductA { public string Name { get; set; } public int Code { get; set; } } public class ProductComparer : IEqualityComparer<ProductA> { public bool Equals(ProductA x, ProductA y) { //Check whether the objects are the same object. if (Object.ReferenceEquals(x, y)) return true; //Check whether the products' properties are equal. return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name); } public int GetHashCode(ProductA obj) { //Get hash code for the Name field if it is not null. int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode(); //Get hash code for the Code field. int hashProductCode = obj.Code.GetHashCode(); //Calculate the hash code for the product. return hashProductName ^ hashProductCode; } } ProductA[] store1 = { new ProductA { Name = "apple", Code = 9 }, new ProductA { Name = "orange", Code = 4 } }; ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 }, new ProductA { Name = "lemon", Code = 12 } }; 

//从两个数组中获取产品//不包括重复项。

 IEnumerable<ProductA> union = store1.Union(store2); foreach (var product in union) Console.WriteLine(product.Name + " " + product.Code); /* This code produces the following output: apple 9 orange 4 lemon 12 */ 

我只想testingUnion如何在重叠的引用types对象集合上使用默认比较器。

我的目标是:

 class MyInt { public int val; public override string ToString() { return val.ToString(); } } 

我的testing代码是:

 MyInt[] myInts1 = new MyInt[10]; MyInt[] myInts2 = new MyInt[10]; int overlapFrom = 4; Console.WriteLine("overlapFrom: {0}", overlapFrom); Action<IEnumerable<MyInt>, string> printMyInts = (myInts, myIntsName) => Console.WriteLine("{2} ({0}): {1}", myInts.Count(), string.Join(" ", myInts), myIntsName); for (int i = 0; i < myInts1.Length; i++) myInts1[i] = new MyInt { val = i }; printMyInts(myInts1, nameof(myInts1)); int j = 0; for (; j + overlapFrom < myInts1.Length; j++) myInts2[j] = myInts1[j + overlapFrom]; for (; j < myInts2.Length; j++) myInts2[j] = new MyInt { val = j + overlapFrom }; printMyInts(myInts2, nameof(myInts2)); IEnumerable<MyInt> myUnion = myInts1.Union(myInts2); printMyInts(myUnion, nameof(myUnion)); for (int i = 0; i < myInts2.Length; i++) myInts2[i].val += 10; printMyInts(myInts2, nameof(myInts2)); printMyInts(myUnion, nameof(myUnion)); for (int i = 0; i < myInts1.Length; i++) myInts1[i].val = i; printMyInts(myInts1, nameof(myInts1)); printMyInts(myUnion, nameof(myUnion)); 

输出是:

 overlapFrom: 4 myInts1 (10): 0 1 2 3 4 5 6 7 8 9 myInts2 (10): 4 5 6 7 8 9 10 11 12 13 myUnion (14): 0 1 2 3 4 5 6 7 8 9 10 11 12 13 myInts2 (10): 14 15 16 17 18 19 20 21 22 23 myUnion (14): 0 1 2 3 14 15 16 17 18 19 20 21 22 23 myInts1 (10): 0 1 2 3 4 5 6 7 8 9 myUnion (14): 0 1 2 3 4 5 6 7 8 9 20 21 22 23 

所以,一切正常。