2009-07-13 2 views
5

확장 메서드 OrderBy 및 ThenBy를 사용하여 여러 필드에서 내 사용자 지정 컬렉션을 정렬합니다. 이 정렬은 컬렉션에 영향을주지 않지만 대신 IEnumberable을 반환합니다. 내 사용자 지정 컬렉션에 IEnumerable 결과를 캐스팅 할 수 없습니다. 어쨌든 내 컬렉션의 순서를 변경하거나 IEnumerable 결과를 내 사용자 지정 컬렉션으로 변환 할 수 있습니까?IEnumerable을 C#의 사용자 정의 유형으로 변환하려면 어떻게해야합니까?

답변

6

컬렉션 유형이 IList<T>를 구현하는 경우 (그것에 Add() 할 수있는) 당신이 확장 방법을 쓸 수있다 :

public static Extensions 
{ 
    public static TColl ToTypedCollection<TColl, T>(this IEnumerable ien) 
     where TColl : IList<T>, new() 
    { 
     TColl collection = new TColl(); 

     foreach (var item in ien) 
     { 
      collection.Add((T) item); 
     } 

     return collection; 
    } 
} 
+0

우수, 감사합니다! –

+0

이 아이디어는 완전히 나를 도왔습니다. 감사! – jeremcc

+0

의 재미, 나는 같은 질문을했다 같은 대답과 함께 온, 그리고 임은 아직도 그것을 할 수있는 더 좋은 방법이 있는지 둘러보고 ... – Nevyn

1

아니요. 쿼리 연산자를 사용하면 원본 컬렉션의 인스턴스를 사용하여 열거 형을 생성하지 않습니다. 오히려,이 기능을 제공하기 위해 개인 구현 (아마도 익명, 가능하지 않을 수도 있음)을 사용합니다.

원본 컬렉션에 원한다면 유형에 따라 IEnumerable<T> (또는 특정 경우 콜렉션에 저장되어있는 것)을 취하는 생성자가 있어야하며 생성자에 쿼리를 전달해야합니다.

그러면 IEnumerable<T>에 대한 To<YourCollectionType>이라는 확장 메서드를 만들 수 있습니다.이 메서드는 IEnumerable<T>이되고 형식의 생성자로 전달한 다음이를 반환합니다.

+0

또는 주조 operayers,이 경우 더 나은 것 같다. – Dykam

+0

오타 : 캐스팅 연산자 – Dykam

1

아니요. ToList 및 ToDictionary 확장 메서드로 설정된 패턴을 따를 수 있습니다. 비슷한 확장 메서드를 작성하여 IEnumerable에서 사용자 고유의 컬렉션 형식을로드합니다.

0

사용자 지정 수집을 정렬 할 수 있도록 IComparer의 고유 한 인스턴스를 작성할 수 있습니다.

당신은 IEnumerable을 반복 할 수 있고 각 항목을 사용자 지정 컬렉션의 새 인스턴스로 다시 덤프 할 수 있습니다.

0

당신은 IEnumerable을 가진 목록을 초기화 할 수 있습니다 : 유형의는 IEnumerable입니다

하면 항목,이 같은 목록을 만들 수 있습니다

var list = new List<string>(items); 

또는 당신은 단순히 items.ToList 를 호출 할 수 있습니다 () :

var list = items.ToList(); 
0

사용자 정의 컬렉션은 어떤 인터페이스를 구현합니까?

의 경우 IList의이 다음은이 IDictionary 다음 당신은 IEnumerable을 기타에 .ToDictionary()를 할 수있을 것입니다 경우는 IEnumerable 에 .ToList()를 할 수있을 것입니다 ..

을 사용하면보다 효과적으로 사용할 수 있습니다.

비슷한 것이 없으면 .ToMyCollection()에 IEnumerable의 확장 메서드를 작성할 수 있습니다.

0

열거 형 및 컬렉션은 매우 다른 짐승입니다.

열거 형은 컬렉션에 인덱스 기반 접근 자, Count 속성 등이있는 동안에 만 열거 할 수 있습니다. 컬렉션을 만들려면 실제로 IEnumerable을 열거해야합니다. List 과 같은 일반적인 컬렉션에는 IEnumerable을 허용하는 생성자가 있습니다. 그럼에도 불구하고 열거가 수행됩니다.

0

System.Linq.열거 클래스 당신은이 방법을 수행하여 사용자 지정 컬렉션을 변환하는 사용자 정의 확장 메서드를 만들 수

var myEnumerable = this.GetEnumerator(); 

var array = myEnumerable.ToArray(); 
var list myEnumerable.ToList(); 

당신이 중 하나를 배열에 당신을 IEnumerable 형식을 변환 할 aloow이 될 몇 가지 확장 방법, ToList이있다

이 같은 소스 - 컬렉션은 불변 취급하기 때문에
public static CustomCollection<TSource> ToCustomCollection<TSource>(this IEnumerable<TSource> source); 
0

LINQ 멋진 - 그것은을 수정하지 않습니다. 확장 메서드를 사용하면 지정한 대체 순서로 열거됩니다.이 방법으로 새 ​​사용자 지정 목록을 작성하지는 않습니다.

나는 두 가지 제안 : 당신이

  • 사용자 지정 모음으로 기능을 분류 구현 LINQ - 보내고 결과를 바탕으로 새로운 목록을 직접 빌드 (또는 같은 좋은 정렬 일반적인 수집을 사용

    1. 을 base)를 사용하여 내부에서 정렬 할 수 있습니다.
  • 0

    은 당신이 정말로 전혀 지정 컬렉션의 종류가 필요하십니까를? 그것은 당신이이 기존의 일반적인 수집 유형에 의해 제공됩니다로 할 수있는 모든 것을 같은 소리, 어쩌면 당신은 그들을 위해 확장 방법 또는에 추가해야합니다.

    관련 문제