Итерация по 2 вложенным спискам

c# linq

215 просмотра

2 ответа

Я пишу приложение погоды и мне нужно пройти через 2 вложенных цикла. Для returnзначения, которое я хочу перебрать в первом списке, просматривая соответствующие данные второго списка. Когда данные во втором списке совпадают bool, мне нужно получить данные из соответствующего первого списка. Теперь я думаю, что мой код работает ... но хотел бы спросить, является ли это хорошим способом сделать это. Я также не уверен, будет ли этот запрос LINQ работать вообще с еще более вложенными списками. Вот мой подход в LINQ:

public static async Task<string> UpdateWeather(string lat, string lon)
{
    WeatherObject weather = await WeatherAPI.GetWeatherAsync(lat, lon);

    var first = (from l in weather.list
                from w in l.weather
                where w.id == 800
                select l.city.name).First();

    return first;
}
Автор: Alexej Источник Размещён: 08.11.2019 11:02

Ответы (2)


2 плюса

Решение

Ваш код в порядке, это запрос LINQ. Но еще одна вещь. Используйте FirstOrDefault()вместо First(). First()выдаст исключение, если соответствующий элемент не найден, но FirstOrDefault()вернет элемент или значение по умолчанию.

Вы также можете написать, LINQ Method syntaxесли вы предпочитаете это.

public static async Task<string> UpdateWeather(string lat, string lon)
{
    WeatherObject weather = await WeatherAPI.GetWeatherAsync(lat, lon);

    var first = weather.list.Where(l => l.weather.Any(w => w.id == 800))
                            .Select(l => l.city.name)
                            .FirstOrDefault();

    return first;
}
Автор: Suren Srapyan Размещён: 20.08.2016 08:36

0 плюса

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

Например, если два элемента weather.listимеют элемент в своем вложенном weatherсписке, может иметь одинаковый идентификатор, то ваш код будет возвращать только первый, что может быть неверно.

например, в JSON:

[
  {
    city : {
      name : "Chicago"
    },
    weather : [
      {
        id = 799
      },
      {
        id = 800
      }
    ]
  },
  {
    city : {
      name : "New York"
    },
    weather : [
      {
        id = 800
      },
      {
        id = 801
      }
    ]
  }
}

Для этого набора данных ваш код возвратит «Чикаго», но «Нью-Йорк» также совпадает. Это может оказаться невозможным при использовании API данных, к которому вы обращаетесь, но, учитывая, что нет никаких ограничений на данные для обеспечения исключительности вложенных списков, вы можете защитить, чтобы в возвращаемом списке было только 0 или 1 элементов, которые соответствуют ожидаемые критерии.

Еще одно предложение

С другой стороны, не совсем ответ на ваш вопрос - если вы думаете, что ваш код будет работать, но не уверены, напишите модульный тест. В этом случае вы поместите вызов WeatherAPI в класс, который реализует определенный вами интерфейс. Обновите свой метод, чтобы вызывать метод по ссылке на интерфейс.

Для вашего реального приложения убедитесь, что экземпляр класса оболочки / прокси установлен на ссылку.

Для модульного теста используйте такую ​​инфраструктуру, как Moq, чтобы создать фиктивную реализацию интерфейса, которая возвращает известный набор данных, и используйте его вместо этого. Затем вы можете определить набор модульных тестов, которые используют макеты, которые возвращают различные структуры данных и гарантируют, что ваш код работает под всеми ожидаемыми структурами.

Это будет намного проще, если ваш класс также не является статическим методом, и если вы можете использовать внедрение зависимостей ( Ninject , Autofac или один из многих других ...), чтобы управлять внедрением соответствующей реализации службы.

Дальнейшие объяснения модульного тестирования, внедрения зависимостей и имитации займут больше, чем я могу написать в этом ответе, но я рекомендую прочитать его - вы никогда не подумаете: «Я думаю, этот код снова работает»!

Автор: Chris Simon Размещён: 20.08.2016 09:03
Вопросы из категории :
32x32