วิธีตรวจสอบว่าองค์ประกอบ List <T> มีรายการที่มีค่าคุณสมบัติเฉพาะหรือไม่


113
public class PricePublicModel
{
    public PricePublicModel() { }

    public int PriceGroupID { get; set; }
    public double Size { get; set; }
    public double Size2 { get; set; }
    public int[] PrintType { get; set; }
    public double[] Price { get; set; }
}

List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

วิธีตรวจสอบว่าองค์ประกอบของpricePublicListมีค่าที่แน่นอนหรือไม่ เพื่อให้แม่นยำยิ่งขึ้นฉันต้องการตรวจสอบว่ามีอยู่pricePublicModel.Size == 200หรือไม่? นอกจากนี้ถ้าองค์ประกอบนี้มีอยู่จะรู้ได้อย่างไรว่าเป็นองค์ประกอบใด?

แก้ไขถ้าพจนานุกรมเหมาะสำหรับสิ่งนี้ฉันสามารถใช้พจนานุกรมได้ แต่ฉันต้องรู้วิธี :)

คำตอบ:


186

หากคุณมีรายการและต้องการทราบว่ามีองค์ประกอบใดที่ตรงกับเกณฑ์ที่กำหนดภายในรายการคุณสามารถใช้FindIndexวิธีการอินสแตนซ์ได้ เช่น

int index = list.FindIndex(f => f.Bar == 17);

เพรดิเคตที่f => f.Bar == 17มีเกณฑ์การจับคู่อยู่ที่ไหน

ในกรณีของคุณคุณอาจเขียน

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}

1
จะเกิดอะไรขึ้นถ้าฉันไม่รู้แอตทริบิวต์ของค่านั้น เช่นฉันมีรายการที่แสดง "18.00" ฉันไม่รู้ว่ามันมาจากไหนฉันจึงต้องการตรวจสอบว่าแอตทริบิวต์มีค่านี้หรือไม่ โดยพื้นฐานแล้วและคล้ายกับตัวอย่างนี้ฉันไม่มี. ขนาดหรือ. bar ฉันต้องการหามัน
Haithem KAROUI

จะเกิดอะไรขึ้นถ้าไม่มีรายการ: ค่าดัชนีจะเป็นอย่างไร?
BKSpurgeon

8
หมายเหตุ:หากองค์ประกอบไม่อยู่จะกลับมาfindIndex –1เอกสารประกอบ: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod

1
@tomloprod นั่นคือเหตุผลที่เขาตรวจสอบดัชนีที่มากกว่าหรือเท่ากับศูนย์ ถ้า (ดัชนี> = 0) ยังสามารถเขียนได้ราวกับว่า (ดัชนี> -1)
DannyC

127
bool contains = pricePublicList.Any(p => p.Size == 200);

6
โดยเคร่งครัดเพื่อดูว่ามีอยู่หรือไม่
Daniel

3
นี่ตอบคำถามไม่ได้จริงๆ เขากล่าวว่าhow to know which one is it
George Johnston

15
อาจไม่ตอบคำถามของเขา แต่แน่นอนว่าช่วยฉันได้เพราะฉันต้องการดูว่ามีวัตถุที่มีชื่อที่กำหนดอยู่แล้วในคอลเล็กชันของฉันหรือไม่ ฉันคาดหวังว่าจะได้รับการปรับปรุง .Contains-method - และนี่คือสิ่งที่ LINQ-expression ทำ ขอบคุณ.
Igor

3
มันตอบคำถามในที่ชื่อ OP อธิบายในคำอธิบายของเขาว่าเขาไม่ต้องการสิ่งที่เขาบอกว่าต้องการจริงๆ ยังมีเขาคนหนึ่งและพวกเราหลายสิบคนพบคำถามนี้ผ่านทาง Google ฉันคิดว่ามันสำคัญกว่าที่เราจะสามารถหาคำตอบที่แท้จริงสำหรับคำถามชื่อเรื่องของเขาได้
MGOwen

5
หากใครลองใช้สิ่งนี้และไม่รู้จัก()คุณต้องเพิ่มโดยใช้ System.Linq ที่ด้านบนสุดของไฟล์
MGOwen


13

ทำได้ง่ายมากโดยใช้ LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}

เป็นไปได้ไหมที่จะแก้ไของค์ประกอบที่ตรงกับเงื่อนไขนี้โดยตรง ไม่ได้รับและจัดเก็บในวัตถุใหม่ แต่เปลี่ยนโดยตรง?
ilija veselica

matchค่าที่จะถูกส่งกลับสามารถแก้ไขได้ (มันเป็นPricePublicModelวัตถุที่อยู่ในรายการ)
Jacob

คุณไม่ควรแก้ไขวัตถุที่เป็นโมฆะโดยตรง คุณสามารถทำได้ตลอดเวลา: match.Size = 300;หรือforeach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. จะไม่ใช้เป็นซับเดียวเอง
Amy West

11

คุณไม่จำเป็นต้องจริง LINQ สำหรับเรื่องนี้เพราะมีวิธีที่ไม่ตรงกับสิ่งที่คุณต้องการ:List<T>Find

List<T>ค้นหาองค์ประกอบที่ตรงกับเงื่อนไขที่กำหนดโดยคำกริยาที่กำหนดและผลตอบแทนที่เกิดขึ้นครั้งแรกภายในทั้งหมดด้วย

รหัสตัวอย่าง:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);

4
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) {
   // There exists one with size 200 and is stored in item now
}
else {
  // There is no PricePublicModel with size 200
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.