IList 또는 IEnumerable을 배열로 변환하는 가장 좋은 방법


99

결과 IList 또는 IEnumerable 결과를 생성 할 수있는 HQL 쿼리가 있습니다.

그러나 내가 선택한 엔티티의 배열을 반환하고 싶습니다.이를 수행하는 가장 좋은 방법은 무엇입니까? 이를 통해 열거하고 배열을 만들거나 정의 된 배열에 CopyTo ()를 사용할 수 있습니다.

더 좋은 방법이 있습니까? CopyTo 접근 방식을 사용했습니다.


4
누군가 Linq 없이 솔루션 있습니까?
Bitterblue

답변:


167

어떤 버전의 .NET을 사용하고 있습니까? .NET 3.5라면 그냥 전화 ToArray()해서 끝낼 것입니다.

제네릭이 아닌 IEnumerable 만있는 경우 다음과 같이하십시오.

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

해당 메서드 내의 형식을 모르지만 메서드 호출자가 알고있는 경우 메서드를 제네릭으로 만들고 다음을 시도하십시오.

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}

3.5이지만 IQuery에는 ToArray가 없으며 IEnumerable 또는 IList도 내가 말할 수있는 한 없습니까?
jishi

2
아니요-하나의 확장 방법 만 있습니다. (인터페이스 자체에는 없습니다.)
Jon Skeet

3
@Shimmy : 그렇습니다 ... 다른 것 외에는 컴파일러에게 어떤 종류의 배열을 기대해야하는지 알려줍니다! 당신 만 원한다면 object[]바로 사용 Cast<object>. 비 제네릭 IEnumerable에는 ToArray확장 메서드가 없으므로 호출 foo.ToArray<object>하거나 이와 유사한 것을 호출 할 수 없습니다 .
Jon Skeet

22
ToArray확장 방법은있는 System.Linq공간, 즉 :) 알고 잘 될 줄 알았는데.
Tomas Jansson

1
@Alexander : 반환되는 값이 실제로 적절한 배열 아니라면 아닙니다 .
Jon Skeet 2015 년

47

.cs 파일에 다음을 입력하십시오.

using System.Linq;

그러면 System.Linq.Enumerable에서 다음 확장 메서드를 사용할 수 있습니다.

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

IEnumerable<object> query = ...;
object[] bob = query.ToArray();

아 ... 단위 테스트 프로젝트에는 기본적으로 linq가 포함되어 있지 않습니다. 감사합니다!
zsf222 2015 년

6

나는 바퀴를 재발 명하고 싶다 ...

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}

당신의 대답과 당신이 바퀴를 재발 명하는 것처럼 느껴진다는 의미를 설명해 주시겠습니까?
ChrisCamp 2013-06-06

heh-나는 실제로 이런 종류의 : 열거 형이 실제로 배열이 될 가능성이없는 경우 ToArray()호출 단계에 대한 새 할당 / 복사를 건너 뛰고 있습니다 (내부 Buffer클래스 를 통해 ) ... "복사 행동, 그들은 상당히 놀랄 것입니다.
JerKimball 2013-06-06

@Chris : System.Linq의 ToArray () 메서드 서명에서 영감을 얻었 기 때문입니다. msdn.microsoft.com/en-us/library/bb298736.aspx
Philippe Matray 2013 년

추가 우스꽝를 들어이 방법의 구현을 호출해야합니다IEnumerable.ToArray()
머핀 맨

2

Linq가없는 경우 다음과 같이 해결했습니다.

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }

도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.