在List之间自由转换 和IEnumerable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在List之间自由转换 和IEnumerable相关的知识,希望对你有一定的参考价值。

我如何将List<MyObject>转换为IEnumerable<MyObject>然后再转回?

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

答案
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
另一答案

List<T>是一个IEnumerable<T>,所以实际上,没有必要将List<T>“转换”为IEnumerable<T>。由于List<T>IEnumerable<T>,你可以简单地将List<T>分配给IEnumerable<T>类型的变量。

反过来说,不是每个IEnumerable<T>都是List<T>的幕后,那么你将不得不称之为ToList()IEnumerable<T>成员方法。

另一答案

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

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

您需要明确地将LINQ表达式结果转换回List<T>

List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()
另一答案

旁白:请注意,标准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)));
}

然后你可以使用:

list.Sort(x=>x.SomeProp); // etc

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

另一答案

List<T>转换为IEnumerable<T>

List<T>实现IEnumerable<T>(以及许多其他如IList<T>, ICollection<T>),因此没有必要将List转换回IEnumerable,因为它已经是IEnumerable<T>

例:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Person person1 = new Person() { Id = 1, Name = "Person 1" };
Person person2 = new Person() { Id = 2, Name = "Person 2" };
Person person3 = new Person() { Id = 3, Name = "Person 3" };

List<Person> people = new List<Person>() { person1, person2, person3 };

//Converting to an IEnumerable
IEnumerable<Person> IEnumerableList = people;

您也可以使用Enumerable.AsEnumerable()方法

IEnumerable<Person> iPersonList = people.AsEnumerable();

IEnumerable<T>转换为List<T>

IEnumerable<Person> OriginallyIEnumerable = new List<Person>() { person1, person2 };
List<Person> convertToList = OriginallyIEnumerable.ToList();

这在Entity Framework中很有用。

另一答案

为了防止内存重复,resharper暗示:

List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myList as List<string>() ?? myEnumerable.ToList();

.ToList()返回一个新的不可变列表。所以对listAgain的更改不会影响@Tamas Czinege答案中的myList。这在大多数情况下是正确的,至少有两个原因:这有助于防止影响其他区域的一个区域的变化(松散耦合),并且它非常易读,因为我们不应该设计具有编译器问题的代码。

但是在某些情况下,例如处于紧密循环或在嵌入式或低内存系统上工作,应考虑编译器的考虑因素。

以上是关于在List之间自由转换 和IEnumerable的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 List<IEnumerable<int>> 转换为 List<int> [重复]

将 IEnumerable<T> 转换为 List<T>

由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]

将通用List / Ienumerable转换为DataTable?

如何在 C# 中将 IEnumerable<T> 转换为 List<T>?

IEnumerable EnumerableRowCollection 之间的转换