在List <T>和IEnumerable <T>之间自由转换

TK.*_*TK. 102 c# linq ienumerable list

我怎么能转换List<MyObject>IEnumerable<MyObject>,然后再回来?

我想这样做是为了在List上运行一系列LINQ语句,例如 Sort()

Tam*_*ege 147

List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
Run Code Online (Sandbox Code Playgroud)

  • 但要注意myEnumarable是与myList相同的对象实例,但listAgain与myEnumerable不是同一个对象实例.根据你想要做什么以及myEnumerable是什么,"List <string> listAgain = myEnumerable as List <string>;" 可能会更好. (29认同)
  • 不要忘记`使用System.Linq;`或者你将无法使用ToList() (15认同)
  • 只是如果他编辑myList然后他将编辑myEnumrable,但如果他编辑listAgain,那么他就不会编辑myEnumerable. (6认同)

Fre*_*els 21

A List<T>是一个IEnumerable<T>,所以实际上,没有必要'转换' List<T>到一个IEnumerable<T>.由于a List<T>是a IEnumerable<T>,您可以简单地将a赋值给List<T>类型的变量IEnumerable<T>.

反过来说,不是每个IEnumerable<T>都是一个List<T>幕后,所以你必须调用ToList()成员的方法IEnumerable<T>.

  • 从技术上讲,ToList是System.Linq.Enumerable的成员方法 (4认同)
  • 我认为你可以在List上投射IEnumerable,就像大卫说的那样. (2认同)

Dan*_*dei 9

A List<T>已经是一个IEnumerable<T>,因此您可以直接在List<T>变量上运行LINQ语句.

如果您没有看到LINQ扩展方法,就像OrderBy()我猜测它是因为您using System.Linq的源文件中没有指令.

您确实需要将LINQ表达式结果转换回List<T>显式结果:

List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 5

旁白:请注意,标准LINQ运算符(根据前面的示例)不会更改现有列表 - list.OrderBy(...).ToList()将基于重新排序的序列创建新列表.但是,创建一个允许您使用lambdas的扩展方法非常简单List<T>.Sort:

static void Sort<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
}

static void SortDescending<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(y), selector(x)));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

list.Sort(x=>x.SomeProp); // etc
Run Code Online (Sandbox Code Playgroud)

这会以通常的方式更新现有列表List<T>.Sort.