Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
.NET 4.x

Непонятка с LINQ и поиском по List<T>

28.11.2017, 21:28. Показов 4449. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Trees
{
    public bool HaveRoots { get; set; }
}
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Trees> trees = new List<Trees>();
            Trees oneTree = new Treees(){HaveRoots = true};
 
            if (trees.Any(t => t.HaveRoots != oneTree.HaveRoots))
            {
                Console.WriteLine("Деревко подрезали с корнем");
            }
            Console.ReadLine();
        }
    }
Почему Any() "не может подрезать деревко"? (условие не выполнено без выброса исключений или ещё чего)

Добавлено через 1 минуту
Интересует логика программиста, создавшего Any()
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2017, 21:28
Ответы с готовыми решениями:

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из List&lt;List&lt;double&gt;&gt;. Таким...

Непонятка наследования интерфейсов в list
Проблему лучше опишу на &quot;пальцах&quot;: Скажем есть интерфейс IMyInterface. Его реализует класс MyClass. Естественно конструкция...

Работа с List<> , linq и БД
List&lt;DataTable&gt; listOFTables = new List&lt;DataTable&gt;(); DataTable dt = new DataTable(); public DataTable...

70
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
28.11.2017, 22:37
skilllab, у вас же лист пустой. Там в принципе не может быть элементов, удовлетворяющих какому-либо условию.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
28.11.2017, 22:58  [ТС]
Lexeq, он НЕ null. Нет исключения.
Нет элементов, знач нет и совпадений по условию != Так? Т.е. выражение логически выполнено

Добавлено через 9 минут
Ну а если копнуть глубже.

https://msdn.microsoft.com/ru-... s.90).aspx

true, если исходная последовательность содержит какие-либо элементы, в противном случае — false.
В исходной последовательности Count = 0. Далее, если начинаем перебирать того чего нет, т.е пытаемся выполнить условие != где в левой части пусто, то должны получить хотя б бесконечность)))
На крайняк какой нить эксепшн, что переборка идёт в пустой коллекции.
Знач как выход за границу массива - то сразу орать OutOfRange, а как переборкой пройтись по тому чего нет, так сразу false и хрен с ним. Мгммммм...
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
28.11.2017, 23:01
skilllab, у вас условие t => t.HaveRoots != oneTree.HaveRoots, в листе нет элементов, удовлетворяющих этому условию, следовательно Any(Func) возвращает false.

Добавлено через 2 минуты
Кстати, в этом случае вот эта ссылка правильнее https://msdn.microsoft.com/ru-... .110).aspx
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
28.11.2017, 23:06  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
в листе нет элементов
Ключевое! Ибо на
Цитата Сообщение от skilllab Посмотреть сообщение
t => t.HaveRoots
должно валиться как на null ссылке, не согласны?
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
28.11.2017, 23:07
Цитата Сообщение от skilllab Посмотреть сообщение
а как переборкой пройтись по тому чего нет
Видишь суслика? Нет! А он есть. Там не то, чего нет, а коллекция из нуля элементов.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
28.11.2017, 23:16  [ТС]
Если бы я был очень гуглоподкованным)) то мог бы найти исходники этого дела и там "ознакомиться" почему так. Но я не такой

Добавлено через 1 минуту
Цитата Сообщение от Lexeq Посмотреть сообщение
а коллекция из нуля элементов
Угу, память забили пустотой. Оно то и понятно, про создание массивов в памяти в курсе. Но дальше то...
Цитата Сообщение от skilllab Посмотреть сообщение
должно валиться как на null ссылке, не согласны?
Добавлено через 7 минут
Зайдём к основам
C#
1
2
3
4
5
6
7
8
Trees oneTree = new Trees() { HaveRoots = true };
 
Trees[] someTreeses = new Trees[1];
 
    if (someTreeses[0].HaveRoots != oneTree.HaveRoots)
    {
        Console.WriteLine("Деревко подрезали с корнем");
    }
Насколько мне позволяет судить логика (ну и VS чуть-чуть ), моя суперпрограмма с деревьями свалится на блоке if().
Ну так и чем же таким выдающимся Any() заслужил проход проверки?
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
28.11.2017, 23:16
Цитата Сообщение от skilllab Посмотреть сообщение
должно валиться как на null ссылке, не согласны?
Нет
Цитата Сообщение от skilllab Посмотреть сообщение
Нет элементов, знач нет и совпадений по условию != Так? Т.е. выражение логически выполнено
Нет
Цитата Сообщение от skilllab Посмотреть сообщение
Если бы я был очень гуглоподкованным))
Гуглите по слову "Предикат". Не благодарите.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
28.11.2017, 23:18
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

Цитата Сообщение от skilllab Посмотреть сообщение
должно валиться как на null ссылке, не согласны?
Не согласен. Для каждого (foreach) - в данном случае для 0, т.е. не для кого проверять условие. Тут же не будет валиться
C#
1
2
3
4
5
for (int i = 0; i < trees.Length; i++) //trees.Length = 0
{
    if(trees[i].HaveRoots)
        Console.WriteLine("Oops..");
}
Цитата Сообщение от skilllab Посмотреть сообщение
исходники этого дела
https://referencesource.micros... references
можно еще рефлектором или ILSpy-ем смотреть исходники.
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
29.11.2017, 00:27  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
исходники
Ахвооотоночо, foreach и List<T>
C#
1
2
3
4
5
static readonly T[]  _emptyArray = new T[0];        
public List()
{
   _items = _emptyArray;
}
Добавлено через 4 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Если бы я был очень гуглоподкованным
Я то по незнанию и "новичковости" всё упирал на то, что где-то в недрах Any() идёт приведение обобщения, и типа null элемент из списка List<T> пытается получить мой t.HaveRoots.

Добавлено через 16 минут
С другой стороны есть придирка по работе Any() c List<T>
Если учесть
Следует иметь в виду, что если массив только объявляется, но явно не инициализируется, каждый его элемент будет установлен в значение, принятое по умолчанию для соответствующего типа данных (например, элементы массива типа bool будут устанавливаться в false, а элементы массива типа int — в 0).
Т.е. по сути тот самый нулевой элемент в List будет существовать, и где то в глубинах памяти будет иметь значения.
А значит, если б там был null - выкинуло бы исключение. Как пример с массивом выше.
Про перебор мне абсолютно понятно и всё логично. Но в случае с Any() как то хитрО всё придумано.

Цитата Сообщение от Lexeq Посмотреть сообщение
Там не то, чего нет, а коллекция из нуля элементов
Тогда получается что я пытаюсь перебрать (просто используя метод Any() ) того чего нет. Так?
С перебором и Count мне абсолютно понятен подход. Но с точки зрения конечного пользователя, для меня неочевидно что в некоторых случаях мне надо делать доп проверку:
C#
1
2
3
4
if (trees.Count != 0 /*важный момент*/ && trees.Any(t => t.HaveRoots != oneTree.HaveRoots))
      {
         Console.WriteLine("Деревко подрезали с корнем");
       }
Если студия и дебаг и релиз мне сами ничего по этому поводу не подсказали.

Добавлено через 6 минут
Крутяк)))
C#
1
2
3
4
5
6
7
8
9
List<Trees> trees = new List<Trees>() { new Trees(), null };
 
            Trees oneTree = new Trees() { HaveRoots = false };
 
            if (trees.Any(t => t.HaveRoots != oneTree.HaveRoots))
            {
                Console.WriteLine("Деревко подрезали с корнем");
            }
            Console.ReadLine();
Как блин предикат null - так сразу Exception, а как перебирать пустую коллекцию - так всё норм, пиши дальше.

Добавлено через 4 минуты
Стоп-стоп-стоп)))
C#
1
2
3
4
5
6
7
8
9
List<Trees> trees = new List<Trees>();
 
Trees oneTree = new Trees() { HaveRoots = true };
 
   if (trees[0].HaveRoots != oneTree.HaveRoots)
      {
         Console.WriteLine("Деревко подрезали с корнем");
      }
Console.ReadLine();
А чего это тут валится?? А потому что null))) тот самый нулевой элемент. И чем же этот нулевой элемент в Any() заслужил как бы быть!?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
29.11.2017, 00:32
Цитата Сообщение от skilllab Посмотреть сообщение
А чего это тут валится??
потому,как идет прямое обращение к элементу номер нуль, которого нет, в случае коллекции List, проверяется !!! есть ли в коллекции элемент удовлетворяющий предикату?!!!
если лист пуст, есть удовлетворяющий?
оно и логично
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
29.11.2017, 00:39  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
если лист пуст, есть удовлетворяющий?
Кароч, меня бы вполне устроила доп строчка в исходнике
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (source.Count == 0) throw Error.ArgumentEmpty("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
foreach (TSource element in source) {
if (predicate(element)) return true;
}
return false;
}
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
29.11.2017, 00:43
ну так дело за малым, устраивайся работать архитектором в Microsoft, и справляй
кмк, НЕ реагирование на пустую входную коллекцию есть бонус, нежели косяк... программист пишет код, и должен понимать что, как и зачем он пишет...
З.Ы. если бы так же учили хирургов - про твою ошибку тебе сообщат из морга, но это нормально
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
29.11.2017, 00:56  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
есть бонус
Да. Согласен. Но могли б хоть в подсказку запихнуть инфу про пустую коллекцию, или в хелп MSDN. Вопросов бы не возникло. Или как там любят ещё в саму среду VS типа ставить галку: отлавливать предупреждения LINQ
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
29.11.2017, 00:58
Цитата Сообщение от skilllab Посмотреть сообщение
А чего это тут валится?? А потому что null))) тот самый нулевой элемент. И чем же этот нулевой элемент в Any() заслужил как бы быть!?
Нет в Any никакого нулевого элемента. Вы же понимаете, что индекс последнего элемента = длинна массива - 1. То если есть нулевой элемент, то размер уже не равен нулю. И вот тут:
C#
1
2
List<Trees> trees = new List<Trees>();
if (trees[0].HaveRoots != oneTree.HaveRoots)
валится не из-за null, а из-за выхода за границы массива.
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,413
29.11.2017, 06:41
Цитата Сообщение от skilllab Посмотреть сообщение
Но могли б хоть в подсказку запихнуть инфу про пустую коллекцию, или в хелп MSDN.
Вообще-то, это само собой разумеющееся поведение. Элементы не могут удовлетворять условию, если их (элементов) нет. Но и ошибки тут нет, ибо пустой список не тоже самое, что отсутствие списка.

Добавлено через 25 минут
Цитата Сообщение от skilllab Посмотреть сообщение
Т.е. по сути тот самый нулевой элемент в List будет существовать, и где то в глубинах памяти будет иметь значения.
List не массив. В пустом массиве нет нулевого элемента. Он же пустой.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.11.2017, 12:00
Цитата Сообщение от skilllab Посмотреть сообщение
Нет элементов, знач нет и совпадений по условию != Так? Т.е. выражение логически выполнено
Any -- любой, какой-либо, какой-нибудь, сколько-нибудь

-- Василич! у нас какой-нибудь ключ на десять есть?
-- Есть.
-- Тащи его сюды!
-- Ключей вообще нет.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
29.11.2017, 13:19  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
-- Василич! у нас какой-нибудь ключ на десять есть?
-- Есть место от ключа на десять в ящике. Я его посмотрел, в нём нет ключа

Добавлено через 7 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Элементы не могут удовлетворять условию, если их (элементов) нет
Согласен, но (исключая из памяти исходник Any), к чему обращаются при сравнении? Вы математически представьте себе эту задачу. Где справа пустое множество "А", а слева значимый тип "А.а.
Какой будет результат выборки из ничего путём выбора из этого ничего и сравнения с чем-то? Как ранее написали:
Цитата Сообщение от Wolfdp Посмотреть сообщение
любой, какой-либо, какой-нибудь
Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Но и ошибки тут нет, ибо пустой список не тоже самое, что отсутствие списка.
Я не писал нигде про ошибку работы Any(), не выдумывайте.
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,413
29.11.2017, 13:27
Цитата Сообщение от skilllab Посмотреть сообщение
Согласен, но (исключая из памяти исходник Any), к чему обращаются при сравнении?
Ни к чему. Any() возвращает TRUE, если имеется хоть одно совпадение. Нет элементов - нет совпадений. Тут всё понятно и очевидно.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
29.11.2017, 13:30  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Ни к чему.
В продолжении...
Цитата Сообщение от skilllab Посмотреть сообщение
-- Есть место от ключа на десять в ящике. Я его посмотрел, в нём нет ключа
-- а нахрена ты, Василич, смотрел в пустом ящике, если знаешь что он пустой?

Результат поиска Василича был верен - ключа нет. Но Василич провёл нелогичное действие, он полез в заведомо известный пустой ящик.

Дальше:
- Василич, вот тебе ключ на 20. Открой верхний пустой ящик, И ЕСЛИ ТАМ НЕТ ПОХОЖЕГО на ключ на 20, то положи его туда. Ибо там у нас лежат все ключи на 20.
Вопрос знатокам: что сделает Василич?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2017, 13:30
Помогаю со студенческими работами здесь

List<>[] перевести в [][] используя Linq
Как перевести массив списков в массив массивов 1 строчкой?

Как значения LINQ поместить в List
В общем есть метод, туда попадают шесть значений LINQ запросом... как мне эти значения засунуть в List? ...

Добавить результат LINQ запроса в конец List<>
Имеется Linq запрос возвращающий несколько строковых значений. Есть List&lt;string&gt; который уже содержит несколько элементов Как результат...

Запрос LINQ к List, как выбрать определенный элемент из списка
Подскажите как выбрать определенный элемент из списка? public class PostTarif { public double Weight {...

LINQ при привязке List<string[]> к DataGrid.DataContext через IBindingList
Приветствую сообщество. Что неправильно в выражении LINQ, приведенном ниже ? Дебаггер показывает что X_loc прекрасно формируется, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru