ฉันจะใช้ Linq เพื่อรับรายการคุณสมบัติที่ไม่ซ้ำจากรายการวัตถุได้อย่างไร


171

ฉันกำลังพยายามใช้ Linq เพื่อส่งกลับรายการรหัสที่ระบุรายการของวัตถุที่ id เป็นคุณสมบัติ ฉันต้องการที่จะสามารถทำเช่นนี้ได้โดยไม่ต้องวนลูปผ่านแต่ละวัตถุและดึงรหัสที่เป็นเอกลักษณ์ที่ฉันพบ

ฉันมีรายการของวัตถุประเภท MyClass และหนึ่งในคุณสมบัติของคลาสนี้คือ ID

public class MyClass
{
  public int ID { get; set; }
}

สิ่งที่ฉันต้องการจะทำคือเขียนแบบสอบถาม Linq เพื่อส่งรายการรหัสเหล่านั้นกลับมาให้ฉัน

ฉันจะทำIList<MyClass>เช่นนั้นได้อย่างไรเมื่อมันคืนค่าIEnumerable<int>ของรหัส?

ฉันแน่ใจว่าต้องเป็นไปได้ที่จะทำในหนึ่งหรือสองบรรทัดโดยใช้ Linq แทนที่จะวนซ้ำแต่ละรายการในรายการ MyClass และเพิ่มค่าที่ไม่ซ้ำกันลงในรายการ

ความช่วยเหลือใด ๆ ในการสร้างโซลูชันที่สง่างามจะได้รับการชื่นชมอย่างมาก!


1
นอกจากนี้ยังทราบว่าคุณมีDistinctByในMoreLinqซึ่งจะทำให้คุณแตกต่างMyClasss IDขึ้นอยู่กับ การใช้งาน:var distincts = list.DistinctBy(x => x.ID);
nawfal

คำตอบ:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

ว้าว! ฉันคิดว่ามันเป็นอะไรที่เรียบง่าย ... ฉันแค่คิดไม่ออก ดูเหมือนว่าฉันจะต้องใช้เวลาทำความคุ้นเคยกับ Linq มากขึ้น
mezoid

29

ใช้โอเปอเรเตอร์ที่แตกต่าง :

var idList = yourList.Select(x=> x.ID).Distinct();

5
(จุดตั้งชื่อเล็ก ๆ น้อย ๆ มันไม่ได้เป็น "รายการ" ของรหัส - มันคือการประเมินอย่างเกียจคร้าน IEnumerable <int> - เว้นแต่คุณจะเรียกว่า. ToList () แน่นอน ;-p)
Marc Gravell

@ Marc, explantion 2 บรรทัดที่เรียบง่ายของ eval ขี้เกียจ? ได้โปรดและขอบคุณ: D
masfenix

2
@masfenix Lazy eval หมายถึงการดำเนินการไม่เสร็จจนกว่าจะมีการใช้งานจริง ในกรณีนี้การเลือก ID และเลือกเฉพาะรายการที่แตกต่างนั้นไม่จำเป็นต้องทำเมื่อมีการดำเนินการคำสั่งในคำตอบนี้ มันจะทำเมื่อคุณเริ่มต้นการสำรวจผ่าน idList ตัวอย่างเช่นในวง foreach
ทำเครื่องหมาย Meuer


3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

เอาท์พุท

1234567890


1
ไม่ตอบคำถามและแม้ว่าจะเพิ่มอะไรใหม่
nawfal

2

เมื่อรับความแตกต่างเราจะต้องทำการคัดเลือก IEnumerable ด้วย ถ้า list เป็น model หมายความว่าต้องเขียนโค้ดแบบนี้

 IEnumerable<T> ids = list.Select(x => x).Distinct();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.