List 간 자유롭게 변환 및 IEnumerable
a List<MyObject>
를 로 변환 한 IEnumerable<MyObject>
다음 다시 되돌리려면 어떻게해야합니까?
목록에서 서비스의 LINQ 문을 실행하기 위해 작업을 수행하고 싶습니다. Sort()
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
List<T>
는 IEnumerable<T>
이므로 실제로 List<T>
를 이 .txt로 '변환'할 필요가 없습니다 IEnumerable<T>
. List<T>
는 이므로 IEnumerable<T>
단순히 List<T>
유형의 변수에 를 할당 할 수 있습니다 IEnumerable<T>
.
반대로 모든 IEnumerable<T>
것이 List<T>
-off 코스가 아니므로 .NET 프레임 워크의 ToList()
멤버 메서드 를 호출해야 우리 합니다 IEnumerable<T>
.
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()
참고 : 표준 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
.
변환 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 ()는 새로운 불변 목록을 반환합니다. 따라서 @Tamas Czinege 답변의 myList에 영향을 미치게됩니다. 이것은 대부분의 경우에 맞습니다. 이 한 영역의 변경이 다른 영역 (느슨한 결합)에 영향을주는 것을 방지하는 데 도움이되는 컴파일러 문제로 코드를 설계 안하고 매우 읽기 쉬운.
그러나 타이트한 루프에 있거나 임베디드 또는 메모리 부족 시스템에서 작업하는 것과 같이 컴파일러 고려 사항을 고려해야하는 특정 인스턴스가 있습니다.
참고 URL : https://stackoverflow.com/questions/472669/freely-convert-between-listt-and-ienumerablet
'IT' 카테고리의 다른 글
Java 프로젝트의 패키지 구조? (0) | 2020.08.16 |
---|---|
매개 변수로 SQL 쿼리의 목록 목록 (0) | 2020.08.16 |
실행중인 BASH 펼쳐의 경로 확인 (0) | 2020.08.16 |
DLL이 디버그 또는 릴리스 빌드인지 확인 방법 (.NET) (0) | 2020.08.16 |
github에서 프로젝트를 어떻게 가져 옵니까? (0) | 2020.08.16 |