IList veya IEnumerable'ı Array'e dönüştürmenin en iyi yolu


101

Bir IList sonuç listesi veya sonuç IEnumerable oluşturabilen bir HQL sorgum var.

Bununla birlikte, seçtiğim Varlığın bir dizisini döndürmesini istiyorum, bunu başarmanın en iyi yolu nedir? Ya içinden numaralandırabilir ve diziyi oluşturabilir ya da CopyTo () tanımlı bir dizi kullanabilirim.

Daha iyi bir yol var mı? CopyTo yaklaşımı ile gittim.


4
Birisi bir çözüm var mı olmadan Linq?
Bitterblue

Yanıtlar:


168

Hangi .NET sürümünü kullanıyorsunuz? NET 3.5 ise, arar ToArray()ve işim biter.

Yalnızca genel olmayan bir IEnumerable'ınız varsa, şöyle bir şey yapın:

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

Bu yöntemdeki türü bilmiyorsanız, ancak yöntemin arayanları bunu biliyorsa, yöntemi genel yapın ve şunu deneyin:

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

3.5 ama IQuery'de ToArray yok, söyleyebildiğim kadarıyla IEnumerable veya IList de yok mu?
jishi

2
Hayır - sadece bir genişletme yöntemi var. (Arayüzün içinde değil.)
Jon Skeet

3
@Shimmy: Evet var ... Her şey bir yana, derleyiciye ne tür bir dizi bekleyeceğini söylüyor! object[]Sadece bir kullanım istiyorsanız Cast<object>. Jenerik olmayanın IEnumerablebir ToArrayuzatma yöntemi yoktur, bu yüzden sadece arayamazsınız foo.ToArray<object>veya buna benzer bir şey yapamazsınız .
Jon Skeet

23
ToArrayUzatma yöntemi olduğunu System.Linqad, yani :) bilmek iyi olabileceğini düşündüm.
Tomas Jansson

1
@Alexander: Değer varlık gerçekten döndürdü sürece olmaz olan uygun bir dizi.
Jon Skeet

47

Aşağıdakileri .cs dosyanıza koyun:

using System.Linq;

Daha sonra System.Linq.Enumerable'dan aşağıdaki uzantı yöntemini kullanabileceksiniz:

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

Yani

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

ahh ... birim test projesi varsayılan olarak linq'i içermez. Teşekkür ederim!
zsf222

6

Tekerleği yeniden icat etmek gibi hissediyorum ...

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

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

Cevabınızı ve ayrıca tekerleği yeniden icat ediyormuş gibi hissettiğinizle ne demek istediğinizi açıklayabilir misiniz?
ChrisCamp

heh - Aslında şuna benziyorum: Numaralandırılabilirin aslında bir dizi olması ihtimaline karşı, yeni tahsisi / kopyayı çağrıdaki adımlara ToArray()(dahili Buffersınıf aracılığıyla ) atlıyorsunuz ... "kopyalama davranışı, oldukça şaşırırlar.
JerKimball

@Chris: Çünkü System.Linq'teki ToArray () yönteminin imzasından ilham aldım. msdn.microsoft.com/en-us/library/bb298736.aspx
Philippe Matray

Daha fazla saçmalık için bu yöntemin uygulanması çağrılmalıdırIEnumerable.ToArray()
The Muffin Man

3

Linq'iniz yoksa, şu şekilde çözdüm:

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

        iList.CopyTo(result, 0);

        return result;
    }

Umarım yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.