결과 IList 또는 IEnumerable 결과를 생성 할 수있는 HQL 쿼리가 있습니다.
그러나 내가 선택한 엔티티의 배열을 반환하고 싶습니다.이를 수행하는 가장 좋은 방법은 무엇입니까? 이를 통해 열거하고 배열을 만들거나 정의 된 배열에 CopyTo ()를 사용할 수 있습니다.
더 좋은 방법이 있습니까? CopyTo 접근 방식을 사용했습니다.
답변:
어떤 버전의 .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;
}
object[]
바로 사용 Cast<object>
. 비 제네릭 IEnumerable
에는 ToArray
확장 메서드가 없으므로 호출 foo.ToArray<object>
하거나 이와 유사한 것을 호출 할 수 없습니다 .
ToArray
확장 방법은있는 System.Linq
공간, 즉 :) 알고 잘 될 줄 알았는데.
.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();
나는 바퀴를 재발 명하고 싶다 ...
public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null)
throw new ArgumentNullException("enumerable");
return enumerable as T[] ?? enumerable.ToArray();
}
ToArray()
호출 단계에 대한 새 할당 / 복사를 건너 뛰고 있습니다 (내부 Buffer
클래스 를 통해 ) ... "복사 행동, 그들은 상당히 놀랄 것입니다.
IEnumerable.ToArray()