як перевірити, чи містить елемент 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? Також, якщо цей елемент існує, як дізнатися, який це?

EDIT Якщо для цього більше підходить словник, то я можу використовувати Словник, але мені потрібно знати, як :)

Відповіді:


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", я не знаю, звідки він надходить, тому я хочу перевірити, який атрибут має це значення? так що в основному, і подібно до цього прикладу, у мене немає .size або .bar, я хочу це зрозуміти
Haithem KAROUI

що робити, якщо елемента не існує: яким буде значення індексу?
BKSpurgeon

8
ПРИМІТКА: Якщо елемента не існує, findIndexповернеться –1. Документація: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod

1
@tomloprod тому він перевіряє на індекс, більший або дорівнює нулю. if (індекс> = 0). Можливо, також написав би це так, як ніби (індекс> -1).
DannyC

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

6
Це суворо, щоб побачити, чи існує.
Даніель А. Білий

3
Це насправді не відповідає на питання. Він сказав:how to know which one is it
Джордж Джонстон

15
Може не відповісти на його запитання, але це впевнено допомогло мені, тому що мені потрібно було перевірити, чи в моїй колекції вже є об’єкт із вказаним іменем. Я очікував вдосконаленого .Contains-методу - і саме це робить цей LINQ-вираз. Дякую.
Ігор

3
Він відповідає на питання в заголовку . ОП пояснює в своєму описі, що він насправді не хоче саме того, що сказав, що хоче. І все-таки є один з нього, і десятки з нас знайшли це питання через google. Я думаю, що важливіше, щоб ми змогли знайти реальну відповідь на його заголовок.
MGOwen

5
Якщо хтось спробує це, і .Any () не розпізнається, вам потрібно додати за допомогою System.Linq; вгорі файлу.
MGOwen

32

Ви можете використовувати існуюче

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

13

Це досить просто зробити за допомогою LINQ:

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

Чи можна безпосередньо редагувати елемент, який відповідає цій умові? Не отримати його і зберігати в новому об’єкті, а змінити безпосередньо?
ilija veselica

matchЗначення, яке повертається може бути змінений (це PricePublicModelоб'єкт , який був у списку).
Яків

Не слід безпосередньо змінювати об'єкт, який може бути недійсним. Ви завжди можете зробити: match.Size = 300;або foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Хоча я не використовував би його як однолінійний лайнер.
Емі Вест

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.