LINQ, IEnumerable ile çalışır mı?


87

Uygulayan IEnumerableancak uygulamayan bir sınıfım var IEnumerable<T>. Bu sınıfı değiştiremem ve onun yerine başka bir sınıf kullanamam. MSDN'den anladığım gibi LINQ, sınıf uygulanıyorsa kullanılabilirIEnumerable<T> . Kullanmayı denedim instance.ToQueryable(), ancak yine de LINQ yöntemlerini etkinleştirmiyor. Bu sınıfın yalnızca bir türden örnekler içerebileceğinden eminim, bu nedenle sınıf uygulayabilir IEnumerable<T>, ancak öyle değil. Peki, bu sınıfı LINQ ifadelerini kullanarak sorgulamak için ne yapabilirim?


IEnumerable'ı çevirmeden, tüm linq yöntemleri yerine yalnızca 8 yöntem göreceksiniz: AsQueryable, Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString
ShawnFeatherly

Yanıtlar:


136

LINQ'yu tam olarak destekleyen bir IEnumerable'ın genel bir sürümünü almak için Cast<T>()veya kullanabilirsiniz OfType<T>.

Örneğin.

IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();

Veya hangi türü içerdiğini bilmiyorsanız, her zaman yapabilirsiniz:

IEnumerable<object> e = objects.Cast<object>();

Jenerik olmayan ürününüz IEnumerableçeşitli türlerde nesneler içeriyorsa ve yalnızca örn. yapabileceğiniz dizeler:

IEnumerable<string> strings = objects.OfType<string>();

2
Her gün LINQ hakkında yeni bir şey öğreniyorum. Her geçen gün daha çok seviyorum.
João Mendes

11

Evet yapabilir. Cast<T>Daktiloya dönüştürmek için işlevi kullanmanız yeterlidir IEnumerable<T>. Örneğin:

IEnumerable e = ...;
IEnumerable<object> e2 = e.Cast<object>();

Şimdi e2bir IEnumerable<T>ve tüm LINQ işlevleriyle çalışabilir.


3

Ayrıca, bir tür belirtilirse, aralık değişkeninin türüne ( itembu örnekte) atan LINQ'nun sorgu anlama sözdizimini de kullanabilirsiniz :

IEnumerable list = new ArrayList { "dog", "cat" };

IEnumerable<string> result =
  from string item in list
  select item;

foreach (string s in result)
{
    // InvalidCastException at runtime if element is not a string

    Console.WriteLine(s);
}

Etki, @ JaredPar'ın çözümüyle aynıdır; Ayrıntılar için bkz. 7.16.2.2: C # dil spesifikasyonundaki Açık Aralık Değişken Türleri .

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.