C# 如何将LINQ查询结果分配给自定义集合并将列表转换为T[]

C# 如何将LINQ查询结果分配给自定义集合并将列表转换为T[],c#,arrays,linq,loops,collections,C#,Arrays,Linq,Loops,Collections,这是一个简单的问题,但我真的不知道如何有效地做到这一点。是否有任何方法可以有效地将值列表转换为数组,例如,直接将列表转换为int[]或将列表转换为CustomObj[],而无需使用循环,最好使用Linq 此外,我有一个GenericCollection,如何在不循环的情况下直接将Linq查询转换为GenericCollection,例如 GenericCollection<T> result = SomeGenericCollection.Select(o => o).ToLi

这是一个简单的问题,但我真的不知道如何有效地做到这一点。是否有任何方法可以有效地将值列表转换为数组,例如,直接将列表转换为int[]或将列表转换为CustomObj[],而无需使用循环,最好使用Linq

此外,我有一个GenericCollection,如何在不循环的情况下直接将Linq查询转换为GenericCollection,例如

GenericCollection<T> result = SomeGenericCollection.Select(o => o).ToList<GenericCollection<T>>();
尝试使用Linqs.ToArray方法

erm,使用Extension方法如何

var intList = new List<int> { 1, 2, 3 };
int[] intArray = intList.ToArray();
在回答扩展问题时,如果GenericCollection实现了IEnumerable,并且您有一个返回IEnumerable或协变类型的查询,如, 如果你能做到

IEnumerable<T> flat = SomeGenericCollectionCollection<T>.SelectMany(o => o)

关键是o本身就是一个IEnumerable。

您只需使用ToArray扩展方法。

只要这样做,就可以使用列表中的ToArray:

List<string> l = new List<string> { "one", "two", "three", "four", "five" };

string[] s = l.ToArray();
您可以使用linq方法来实现

List<int> lst = new List<int>();
int arr[] = lst.ToArray();
实现IEnumerable,因此扩展方法应该适合您

如果没有,请尝试以下操作:

using System.Linq;

GenericCollection<T> gc = ...
T[] arr = ((IEnumerable<T>)gc).ToArray();


对于问题的第一部分,请按照其他答案查看ToArray方法:

List.ToArray: Enumerable.ToArray扩展方法: 对于第二部分,您可以编写自己的扩展方法:

public static class MyExtensions
{
   public static GenericCollection<T> ToGenericCollection<T>(
     this IEnumerable<T> input
   )
   {
      // write the conversion here - typically you will need a for loop
   }
}

您确实无法避免编写循环,但这样您只需编写一次。

有一种ToArray方法可以做到这一点:按。在列表对象的末尾,然后按CTRL+Space,它将在列表中为您打开intellisense,您将寻找您希望实现的目标-所有这些都是intellisense。这个问题已经存在,LINQ使用迭代循环,因此您无法完全避免循环。但我不想在LINQ查询之后使用循环设置我的GenericCollection,还有其他有效的方法吗?@abatishchev,为了平息你的学究气,扩展就是扩展。因此,扩展方法是.Net Framework的扩展。我已经按照要求使用了特定的专有名词,而不是通用术语。如果您愿意,扩展方法是C/VB.NET编译器的扩展,是一种语法糖。但不是.NET Framework的扩展。我更喜欢用有意义的名称和IList或var来声明l。谢谢你的回答,尽管我使用了类似的方法。如果Linq不提供直接将结果从IEnumerable分配给GenericCollection的方法,那就很奇怪了,因为GenericCollection是从IEnumerable派生的?我们不能在没有自己的entension方法的情况下避免循环吗?@FurqanSafdar你不能避免循环,不。for循环可能隐藏在框架或自定义方法中,但它总是存在的。
T[] arr = new List<T>(gc).ToArray();
public static class MyExtensions
{
   public static GenericCollection<T> ToGenericCollection<T>(
     this IEnumerable<T> input
   )
   {
      // write the conversion here - typically you will need a for loop
   }
}
var result = SomeGenericCollection.Select(o => o).ToGenericCollection();