как проверить, содержит ли элемент 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? Кроме того, если этот элемент существует, как узнать, какой это?

ИЗМЕНИТЬ Если Dictionary больше подходит для этого, я мог бы использовать Dictionary, но мне нужно было бы знать, как :)

Ответы:


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, поэтому он проверяет индекс больше или равный нулю. если (индекс> = 0). Мог бы также написать как если бы (индекс> -1).
DannyC

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

6
Это строго для того, чтобы увидеть, существует ли он.
Дэниел А. Уайт

3
Это не совсем ответ на вопрос. Он сказал,how to know which one is it
Джордж Джонстон

15
Не могу ответить на его вопрос, но это действительно помогло мне, потому что мне нужно было увидеть, существует ли уже объект с заданным именем в моей коллекции. Я ожидал улучшения .Contains-method - и это именно то, что делает это LINQ-выражение. Спасибо.
Игорь

3
Он отвечает на вопрос в заголовке . ОП объясняет в своем описании, что на самом деле он не хочет именно того, что, по его словам, он хочет. Тем не менее, есть один из них, и десятки из нас находят этот вопрос через Google. Я думаю, что более важно, чтобы мы смогли найти настоящий ответ на его заглавный вопрос.
MGOwen

5
Если кто-то пытается это сделать, а .Any () не распознается, вам нужно добавить using 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объект , который был в списке).
Джейкоб

Вы не должны напрямую изменять объект, который может иметь значение NULL. Вы всегда можете сделать: 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.