Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;T>;用于'的串联;X';列表数量_C#_Linq_Generics_C# 3.0 - Fatal编程技术网

C# 列表<;T>;用于'的串联;X';列表数量

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).

例如,我有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).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和LINQ
Concat
,那么在使用
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();