C# 列表<;T>;用于'的串联;X';列表数量
例如,我有5个相同类型的列表。我能简单地做吗C# 列表<;T>;用于'的串联;X';列表数量,c#,linq,generics,c#-3.0,C#,Linq,Generics,C# 3.0,例如,我有5个相同类型的列表。我能简单地做吗 List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4)..... List newset=List1.Concat(List2).Concat(List3).Concat(List4)。。。。。 是的,你可以这样做 List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
List newset=List1.Concat(List2).Concat(List3).Concat(List4)。。。。。
是的,你可以这样做
List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
List newSet=List1.Concat(List2).Concat(List3).Concat(List4.ToList();
您当然可以这样做,尽管它可能效率不高
如其他答案所述,不要忘记在代码行末尾添加.ToList()
,或使用List1.AddRange(List2);列表1.AddRange(列表3)代码>以提高效率。您可以这样做(尽管最后需要.ToList()
)
但是,生成单个列表并使用AddRange添加到每个列表中会(稍微)更有效。只需使用所有列表的总大小初始化列表,然后反复调用AddRange
你可能想考虑这样的事情:
public List<T> ConcatMultiple<T>(this List<T> list, params[] ICollection<T> others)
{
List<T> results = new List<T>(list.Count + others.Sum(i => i.Count));
results.AddRange(list);
foreach(var l in others)
results.AddRange(l);
return results;
}
public List ConcatMultiple(此列表,参数[]i集合其他)
{
列表结果=新列表(List.Count+others.Sum(i=>i.Count));
结果:添加范围(列表);
foreach(在其他情况下为var l)
结果:AddRange(l);
返回结果;
}
然后通过以下方式拨打电话:
List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4);
List newset=List1.ConcatMultiple(List2、List3、List4);
您可以,但不要忘记附加.ToList()代码>最后。
您还可以调用newset.AddRange(ListX)代码>我认为变量列表计数的性能更好:
IEnumerable<T> enumerable = Enumerable.Empty<T>();
foreach (List<T> list in [whatever])
enumerable = enumerable.Concat(list);
IEnumerable enumerable=enumerable.Empty();
foreach(在[任何]中列出)
enumerable=enumerable.Concat(列表);
如果需要依赖列表,可以在末尾添加“ToList()”:
List<T> list = enumerable.ToList();
List List=enumerable.ToList();
但是,这可能不是必需的。如果您想要在LINQ中使用一个真正的联合,那么您可以在LINQ中使用它。如果您想要连接任意数量的列表(以前未知),那么您可能需要连接一个列表集合。可能最简单的方法是使用SelectMany
操作符(或LINQ查询中嵌套的from
子句):
我相信C#编译器实际上可能会对此进行优化,这样它就不会迭代所有单独的元素(并且做与上面显式版本相同的事情)。如果您有已知数量的列表,您当然可以编写:
List<int> result = (from l in new[] { list1, list2, list3, list4 }
from e in l select e).ToList();
List result=(从新[]{list1,list2,list3,list4}中的l开始)
从l中的e中选择e);
它不像定义自己的方法那样优雅,但它显示了LINQ查询语法的强大功能。将其作为特定列表的扩展方法似乎有点奇怪,因为它返回一个全新的列表,并且不会以任何方式影响主列表。@Ilia:我觉得这并不奇怪,因为它实际上与Enumerable.Concat在用法上没有什么不同:几乎相同:我认为当您已经在使用List
s时,AddRange
更好,但是如果您正在使用IEnumerable和LINQConcat
,那么在使用ToList()
之前什么都不做,因此它可能更有效。
List<int> result = (from l in lists
from e in l select e).ToList();
List<int> result = (from l in new[] { list1, list2, list3, list4 }
from e in l select e).ToList();