Найти конкретное значение из списка в c# mvc

У меня есть список с такими пунктами:

selCountry[0] = {IdCountry = 1, LongName = "Austria", CountryUrl = "austria"}
selCountry[1] = {IdCountry = 5, LongName = "Brasil", CountryUrl = "brasil"}

Я знаю CountryUrl и мне нужно найти IDcountry

Я пробовал эти способы:

int idCountry;
string country = "brasil";

idCountry = Convert.ToInt32(selCountry.FirstOrDefault(m => m.CountryUrl == country).IdCountry);
idCountry = selCountry.Find(x => x.CountryUrl == country).IdCountry;
idCountry = selCountry.SingleOrDefault(x => x.CountryUrl == country).IdCountry;

Каждый раз, когда я получаю ошибку

Object reference not set to an instance of an object

Если я отлажу его, я увижу что-то подобное:

System.Linq.Enumerable.SingleOrDefault(...) returned null.

Где я ошибся?

PS: Мой вопрос не в том, как я могу решить проблему с помощью null, а в том, где проблема в моем коде, потому что в моем примере "brasil" существует в списке, так как я могу получить IdCountry? Если я использую только First вместо FirstOrDefault, я получаю System.InvalidOperationException: «Последовательность не содержит совпадающего элемента» Итак, как это возможно, что нет соответствующего элемента?

Объявление моего списка

            List<CountriesListModel> selCountry = new List<CountriesListModel>();
        selCountry = listOfCoutry.CountriesList(24);

Моя модель:

public class CountriesListModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdCountry { get; set; }
    [Required]
    public string LongName { get; set; }
    public string CountryUrl { get; set; }

}

Мой результат отладки:

https://www.dropbox.com/s/3m8a81ltxn6kiew/listproblem.jpg?dl=0

IDcountry - это не то же самое, что IdCountry. Как насчет того, чтобы дать нам рабочий минимальный воспроизводимый пример?
Goodbye StackExchange 13.09.2018 20:11

Этот ответ вам поможет: stackoverflow.com/questions/19947464/…

Stefan 13.09.2018 20:13

Извините, ребята - IdCountry и IDcountry - это единственная моя ошибка в написании. страна - это строка - я исправил это в моем примере выше

Jan Šalomoun 13.09.2018 20:13

Все еще нет mcve ...

NineBerry 13.09.2018 20:27

@ JanŠalomoun: покажите полный код объявления и инициализации selCountry: он важен и отсутствует.

Stefan 13.09.2018 20:34

Хорошо, еще одна вещь: это: selCountry[0] = {IdCountry = 1, LongName = "Austria", CountryUrl = "austria"} не компилируется, пожалуйста, скопируйте точный код, который вы используете. И: проверьте, является ли один из элементов, возвращенных listOfCoutry.CountriesList(24);, нулевым.

Stefan 13.09.2018 21:00

Если selCountry[1] = {IdCountry = 5, LongName = "Brasil", CountryUrl = "brasil"} является возвращаемым значением из вызова CountiesList (возможно, я пропустил это в моем предыдущем комментарии), тогда, пожалуйста, скопируйте данные или покажите снимок экрана, потому что, как вы сами сказали: элемент должен быть в списке. Также проверьте наличие опечаток, пробелов, заглавных букв и т. д.

Stefan 13.09.2018 21:03

elCountry [0] = {IdCountry = 1, LongName = "Austria", CountryUrl = "austria"} - был только примером. В действительности я заполняю его другим способом, и если я его отлаживаю, я вижу, что этот список действительно полон элементов.

Jan Šalomoun 13.09.2018 21:05

@ JanŠalomoun: значит, тут должна быть опечатка, что-то неожиданное; чтобы доказать мое утверждение: см. dotnetfiddle.net/95XDgM, он только говорит, что его нет, если его нет ;-).

Stefan 13.09.2018 21:07

Какова ценность country в этом случае? Я предполагаю, что это не «brasil», а «brasil» или «brasil» или что-то в этом роде.

NineBerry 13.09.2018 21:28

@Stefan - ты прав. Теперь я знаю, что с LINQ нет проблем ... Спасибо, я попытаюсь найти, где проблема.

Jan Šalomoun 13.09.2018 21:29

На самом деле, на скриншоте список содержит "brazil" с z, но в приведенном выше примере вы используете "brasil" с s.

NineBerry 13.09.2018 21:33

@NineBerry - я тупой идиот! Такая глупая ошибка - два часа моей жизни .. Спасибо, что спасли меня !!!!

Jan Šalomoun 13.09.2018 21:45
0
14
814
3

Ответы 3

вот решение:

selCountry.Where(w=>w.CountryUrl.Equals(country)).select(s=>s.IDcountry)

Как вы видите выше, вам нужно использовать .select (s => s.IDcountry), потому что результатом Single of Where является один элемент, который выглядит как

{IDcountry = 1, LongName = "Austria", CountryUrl = "austria"}

и из этого вам нужно выбрать атрибут IDcountry.

(Вы можете использовать Single вместо Where, если уверены, что у вас всегда будет страна, если нет, вам нужно проверить, есть ли у нас результат, и он не равен нулю, затем выберите)

Благодарю всех вас. Я тупой идиот - проблема была только с - страна строки объявления - brasil vs. brazil. На самом деле спасибо @NineBery. Ты спас мою ночь ....

System.Linq.Enumerable.SingleOrDefault (...) вернул значение null.
к фиксированному нулевому значению

 var ID = selCountry.Where(x => x.IDcountry == 1).Select(s=>s.LongName ).FirstOrDefault();

Другие вопросы по теме