bagaimana cara memeriksa apakah elemen Daftar <T> berisi item dengan Nilai Properti Tertentu

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

Bagaimana memeriksa apakah elemen pricePublicListmengandung nilai tertentu. Lebih tepatnya, saya ingin memeriksa apakah ada pricePublicModel.Size == 200? Juga, jika elemen ini ada, bagaimana cara mengetahui yang mana itu?

EDIT Jika Dictionary lebih cocok untuk ini maka saya dapat menggunakan Dictionary, tetapi saya perlu tahu caranya :)

ilija veselica
sumber

Jawaban:

186

Jika Anda memiliki daftar dan ingin tahu di mana dalam daftar tersebut terdapat elemen yang cocok dengan kriteria tertentu, Anda dapat menggunakan FindIndexmetode instance. Seperti

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

Dimana f => f.Bar == 17merupakan predikat dengan kriteria yang sesuai.

Dalam kasus Anda, Anda mungkin menulis

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}
Anthony Pegram
sumber
1
bagaimana jika saya tidak tahu atribut dari nilai itu? misalnya saya memiliki item daftar yang menampilkan "18.00" saya tidak tahu dari mana asalnya jadi saya ingin memeriksa atribut mana yang memiliki nilai ini? jadi pada dasarnya, dan serupa dengan contoh ini saya tidak memiliki .size atau .bar saya ingin mengetahuinya
Haithem KAROUI
bagaimana jika item tidak ada: berapa nilai indeksnya?
BKSpurgeon
8
CATATAN: Jika elemen tidak ada, findIndexakan kembali –1. Dokumentasi: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod
1
@tomloprod itu sebabnya dia memeriksa indeks yang lebih besar dari atau sama dengan nol. jika (indeks> = 0). Bisa juga menulisnya seolah-olah (indeks> -1).
DannyC
127
bool contains = pricePublicList.Any(p => p.Size == 200);
Daniel A. White
sumber
6
Ini hanya untuk melihat apakah ada.
Daniel A. White
3
Ini tidak benar-benar menjawab pertanyaan itu. Dia berkata,how to know which one is it
George Johnston
15
Mungkin tidak menjawab pertanyaannya, tetapi itu pasti membantu saya, karena saya perlu melihat apakah objek dengan nama tertentu sudah ada di koleksi saya. Saya mengharapkan peningkatan .Contains-method - dan inilah yang dilakukan ekspresi LINQ ini. Terima kasih.
Igor
3
Ini menjawab pertanyaan di judul . OP menjelaskan dalam uraiannya bahwa dia tidak benar-benar menginginkan apa yang dia inginkan. Tetap saja, ada salah satu dari dia, dan lusinan dari kita menemukan pertanyaan ini melalui google. Saya pikir lebih penting bagi kami untuk dapat menemukan jawaban sebenarnya atas pertanyaan judulnya.
MGOwen
5
Jika ada yang mencoba ini dan .Any () tidak dikenali, Anda perlu menambahkan menggunakan System.Linq; di bagian atas file Anda.
MGOwen
32

Anda dapat menggunakan yang ada

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}
Tiago
sumber
13

Ini cukup mudah dilakukan menggunakan LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Yakub
sumber
Apakah mungkin untuk langsung mengedit elemen yang cocok dengan kondisi ini? Bukan untuk mendapatkannya dan menyimpannya di objek baru, tetapi langsung mengubahnya?
ilija veselica
The matchnilai yang dikembalikan dapat dimodifikasi (itu adalah PricePublicModelobjek yang berada di daftar).
Jacob
Anda tidak boleh secara langsung mengubah objek yang bisa jadi null. Anda selalu dapat melakukan: match.Size = 300;atau foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Saya tidak akan menggunakannya sebagai satu baris.
Amy West
11

Anda tidak benar-benar perlu LINQ untuk karena ini List<T>menyediakan metode yang tidak persis apa yang Anda inginkan: Find.

Mencari elemen yang cocok dengan kondisi yang ditentukan oleh predikat yang ditentukan, dan mengembalikan kemunculan pertama dalam keseluruhan List<T>.

Kode contoh:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);
Mark Byers
sumber
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
}
Mahesh Velaga
sumber