回答:
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
using System.Linq;
、そうしないとToList()ができなくなります
A List<T>
はIEnumerable<T>
なので、実際にはa List<T>
をに「変換」する必要はありませんIEnumerable<T>
。a List<T>
はIEnumerable<T>
なので、List<T>
型の変数にa を割り当てるだけIEnumerable<T>
です。
逆に言えば、すべてIEnumerable<T>
がList<T>
必須ではないので、のToList()
メンバーメソッドを呼び出す必要がありますIEnumerable<T>
。
A List<T>
は既になIEnumerable<T>
ので、List<T>
変数に対して直接LINQステートメントを実行できます。
LINQ拡張メソッドが表示されない場合は、ソースファイルにディレクティブOrderBy()
がないためだと思いusing System.Linq
ます。
List<T>
ただし、LINQ式の結果を明示的に変換して戻す必要があります。
List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()
余談:標準のLINQ演算子(前の例のように)は既存のリストを変更しないことに注意してください- list.OrderBy(...).ToList()
並べ替えられたシーケンスに基づいて新しいリストを作成します。ただし、ラムダを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
。
ToList
-明確にしますが。
List<T>
していますIEnumerable<T>
List<T>
実装IEnumerable<T>
(および他の多くのようにIList<T>, ICollection<T>
)ので、それ以来、既に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には影響しません。これは、少なくとも2つの理由でほとんどの場合において正しいです。これは、一方の領域での変更が他方の領域に影響するのを防ぐのに役立ち(疎結合)、コンパイラの問題でコードを設計するべきではないため、非常に読みやすくなっています。
ただし、タイトループにある場合や、組み込みシステムやメモリ不足のシステムで作業している場合など、コンパイラの考慮事項を考慮する必要がある特定のインスタンスがあります。