LINQ ทำงานร่วมกับ IEnumerable หรือไม่


87

ฉันได้เรียนที่นำไปปฏิบัติแต่ไม่ได้ดำเนินการIEnumerable IEnumerable<T>ฉันไม่สามารถเปลี่ยนชั้นเรียนนี้และฉันไม่สามารถใช้ชั้นเรียนอื่นแทนได้ เป็นฉันได้เข้าใจจาก MSDN LINQ IEnumerable<T>สามารถใช้ในกรณีการดำเนินการระดับ ฉันได้ลองใช้instance.ToQueryable()แล้ว แต่ยังไม่เปิดใช้งานเมธอด LINQ ฉันรู้แน่นอนว่าคลาสนี้สามารถมีอินสแตนซ์ได้เพียงประเภทเดียวดังนั้นคลาสจึงสามารถใช้งานIEnumerable<T>ได้ แต่ก็ไม่ได้ ฉันจะสอบถามคลาสนี้โดยใช้นิพจน์ LINQ ได้อย่างไร


โดยไม่ต้องใช้ IEnumerable แทนที่จะใช้วิธี linq ทั้งหมดคุณจะเห็นเพียง 8 วิธี: AsQueryable, Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString
ShawnFeatherly

คำตอบ:


136

คุณสามารถใช้Cast<T>()หรือOfType<T>รับ IEnumerable เวอร์ชันทั่วไปที่รองรับ LINQ อย่างสมบูรณ์

เช่น.

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

หรือหากคุณไม่ทราบว่ามีประเภทใดคุณสามารถทำได้:

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

หากสิ่งที่ไม่ใช่ทั่วไปของคุณIEnumerableมีวัตถุประเภทต่างๆและคุณสนใจเท่านั้นเช่น สตริงที่คุณสามารถทำได้:

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

2
ทุกวันฉันเรียนรู้สิ่งใหม่ ๆ เกี่ยวกับ LINQ ทุกๆวันฉันรักมันมากขึ้นเรื่อย ๆ
João Mendes

11

ใช่มันทำได้ คุณเพียงแค่ต้องใช้ฟังก์ชั่นจะได้รับมันแปลงเป็นพิมพ์Cast<T> IEnumerable<T>ตัวอย่างเช่น:

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

ตอนนี้e2เป็นIEnumerable<T>และสามารถทำงานร่วมกับฟังก์ชัน LINQ ทั้งหมด


3

คุณยังสามารถใช้ไวยากรณ์การทำความเข้าใจการสืบค้นของ LINQ ซึ่งส่งไปยังประเภทของตัวแปรช่วง ( itemในตัวอย่างนี้) หากระบุประเภท:

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);
}

เอฟเฟกต์จะเหมือนกับโซลูชันของ @ JaredPar; ดู7.16.2.2: Explicit Range Variable typesในข้อกำหนดภาษา C # สำหรับรายละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.