#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;