Эквивалент LINQ следующего кода?

#c# #linq

#c# #linq

Вопрос:

Я нахожусь в процессе изучения LINQ и хотел бы получить некоторую помощь по следующему методу. Как я могу переписать следующий метод для использования LINQ?

 private bool IsInList(string file, List<FileInfo> excelList)
{
    if (excelList != null amp;amp; excelList.Count > 0)
    {
        foreach (FileInfo f in excelList)
        {
            if (string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0)
            {
                return true;
            }
        }
    }

    return false;
}
  

Ответ №1:

Я бы изменил второй параметр, чтобы вместо него принимать IEnumerable<FileInfo> , чтобы вы не ограничивались только списками.

 private bool IsInList(string file, IEnumerable<FileInfo> excelList)
{
    return excelList != null amp;amp; excelList.Any(f => f.FullName.Equals(file, StringComparison.OrdinalIgnoreCase));
}
  

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

1. Технически это не эквивалентно: ваш код может выдавать исключение там, где исходное исключение не было бы — когда FullName равно null.

2. Спасибо, мне нравится однострочный вариант. По какой-то причине я пытался сделать это с помощью Where(). Я просто перехожу к LINQ, спасибо за быстрый ответ.

3. @Chris: Я думал об этом и пришел к выводу, что FullName никогда не будет null . Я почти уверен, что это так. Для меня нет логической причины, почему они заставили бы его вернуться null в любом случае. В противном случае было бы простым решением использовать средство сравнения статического равенства.

Ответ №2:

Использование лямбд:

 private bool IsInList(string file, List<FileInfo> excelList)
{
    return excelList != null amp;amp; excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0);
}
  

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

1. Может быть, вы создаете исключение там, где раньше он его не создавал. Он просил эквивалент.

2. Однако это не был мой отрицательный отзыв: вы изменили семантику кода без какой-либо очевидной причины (создав исключение)

3. Я поддержу тебя. Проверка на нуль в этом случае не обязательно является плохой вещью. Если это действительно причина снижения, то это неуместно, даже если это не буквальный перевод.

Ответ №3:

Что-то вроде этого:

 private bool IsInList(string file, List<FileInfo> excelList)
{
    if (excelList == null) return false;
    return excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0));
}
  

Ответ №4:

Попробуйте это — совершенно непроверенный.

 private bool IsInList(string file, List<FileInfo> excelList)
{
    if (excelList != null amp;amp; excelList.Count > 0)
    {
        return excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0);
    }

    return false;
}
  

Ответ №5:

Этого должно хватить…

 if (excelList != null amp;amp; excelList.Count > 0)
{
    return (from f in excelList
            where (string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0)
            select f).Any();
}
return false;