Сравнение атрибутов из списка внутри списка

#c# #.net #list #oop #string-comparison

#c# #.net #Список #ооп #сравнение строк

Вопрос:

Описание

Моя цель — сравнить язык объекта меню из списка меню. Поскольку в списке меню языки предлагаются в виде другого списка, это немного усложняет задачу. Итак, я попытался создать новый объект класса с теми же значениями, чтобы я мог использовать menuList .Языки.Содержит (languageObject), однако я быстро обнаружил, что это работает не так. Я попытался создать цикл for внутри цикла for, который также не работал, но мог быть сбоем с моей стороны.

Очевидно, я не могу написать что-то вроде: MenuList .Languages.Name.Equals(«Английский»).

Из-за этого я ищу решение, в котором я могу проверить, соответствует ли имя атрибута списка языков внутри списка меню выбранному мной значению.

Объект

 private LanguageBox LangEng = new LanguageBox
{
    IsoCode = "eng",
    Name = "English"
};
 

Список

 var MenuList = menuDataClient.GetMenuByCity(city)
    .Select(nap => new MenuBox()
    {
        Menu = nap.Menu,
        Languages = nap.Languages
            .Select(lang => new LanguageBox()
            {
                IsoCode = lang.IsoCode,
                Name = lang.Name
            }).ToList()
    })
    .ToList();
 

Цикл

 for (int i = 0; i < MenuList.Count; i  )
{
   if (MenuList[i].Languages.Contains(LangEng))
   {
      System.Console.WriteLine("Success");
   }
}
 

Комментарии:

1. Вы ищете что-то вроде (MenuList[i].Languages.Contains(x => x.Name.Equals(LangEng)))

2. Привет, мне кажется, что это относится к a join ; можете ли вы показать данные списка, то, что вы хотите выбрать, и желаемый результат?

3. Вы можете определить IEqualityComparer и использовать перегрузку Contains . Ссылка . Используйте это, если вы хотите сравнить весь объект. Если хотите сравнить только имя, используйте предложения, упомянутые @Quercus.

Ответ №1:

Может быть, linq Where может помочь? Что-то вроде:

 foreach(var item in MenuList)
{
   var x = item.Languages.Where(obj => obj.Name == <desired language>);
   if (x.Count() > 0)  
   {
       //Success code
       break;
   }
}
 

Ответ №2:

Я нашел решение. Эта опция LINQ работает, если вы хотите сохранить в списке только те элементы, в списке языков которых есть английский или русский.

Решение

 .Where(lang => lang.Languages.Any(any => any.Name.Equals("English") || any.Name.Equals("Russian")))