как проверить, содержит ли элемент 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.