Самый чистый способ пропустить запись в foreach на основе условия - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть вложенный цикл foreach, и я хотел бы знать, каков наилучший способ пропустить запись на основе условия if в c #.

Ниже приведено мое решение, если есть какие-либо улучшения илипредложения, пожалуйста, дайте мне знать.

foreach (var ospMap in sourceSpecificMaps)
{
    foreach (var idMapSensorId in ospMap.SensorIds)
    {
        try
        {
            if (string.IsNullOrEmpty(idMapSensorId.SourceId))
            {
                throw new Exception($"SourceId couldn't be found in the { idMapSensorId.SensorId } sensor. The sensor is being skiped.");
            }
            _ospIdMapDictionary[GenCacheId(sourceId, idMapSensorId.SensorId)] = ospMap;
       }
       catch (Exception)
       {
            // We continue through the loop
            continue;
       }  
    }
}

Ответы [ 5 ]

1 голос
/ 05 ноября 2019

То, что вы хотите, выглядит примерно так:

foreach (var ospMap in sourceSpecificMaps)
{
    foreach (var idMapSensorId in ospMap.SensorIds)
    {
        if (string.IsNullOrEmpty(idMapSensorId.SourceId))
        {
            // SourceId couldn't be found in the sensor. The sensor is being skipped.
            continue;
        }
        _ospIdMapDictionary[GenCacheId(sourceId, idMapSensorId.SensorId)] = ospMap; 
    }
}

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

И в вашем примере, как уже говорили другие, вы на самом деле не «обрабатываете» исключение. Вы просто игнорируете его и пропускаете оставшееся тело цикла после оператора if. Точно такое же поведение получается из приведенного выше кода.

1 голос
/ 05 ноября 2019

с помощью linq вы можете сделать что-то вроде этого:

var list = outerList.SelectMany (x => x.TheInnerList) .Where (n =>! String.IsNullOrEmpty (n.Id));

Я думаю, что перебирать эти элементы на основе начального условия - это самый чистый способ выполнить работу

1 голос
/ 05 ноября 2019

Я думаю, что вы можете удалить свою попытку, если она вам не нужна для логического процесса,

Тогда у вас будет такой код:

foreach (var ospMap in sourceSpecificMaps)
{
    foreach (var idMapSensorId in ospMap.SensorIds)
    {

            if (string.IsNullOrEmpty(idMapSensorId.SourceId))
            {
                 continue; // SourceId couldn't be found in the { idMapSensorId.SensorId } sensor. The sensor is being skiped
            }
            _ospIdMapDictionary[GenCacheId(sourceId, idMapSensorId.SensorId)] = ospMap;

    }
}
1 голос
/ 05 ноября 2019

Использование таких исключений является медленным (исключения очень медленным) и ужасной практикой. Просто используйте продолжить, если вы хотите пропустить.

foreach (var ospMap in sourceSpecificMaps)
{
  foreach (var idMapSensorId in ospMap.SensorIds)
  {
    if (string.IsNullOrEmpty(idMapSensorId.SourceId))
    {
      continue; // TODO: Log the follwoing ?  SourceId couldn't be found in the { idMapSensorId.SensorId } sensor. The sensor is being skiped
    }
    _ospIdMapDictionary[GenCacheId(sourceId, idMapSensorId.SensorId)] = ospMap;
  }

}
1 голос
/ 05 ноября 2019

Вы используете исключения для управления логическим потоком, что, как правило, является плохой идеей. Если вы на самом деле не собираетесь что-то делать с этим исключением, избавьтесь от него и просто вставьте оператор continue в оператор if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...