Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Интересный спецэффект в LINQ - не всегда работает Distinct?

Jurijus Zaksas Искусственный Интеллект (429974), открыт 3 недели назад
Собссно, хотел накатать короткое решение для вот этого вот: https://otvet.mail.ru/question/238409644
Программка:
 Random r = new Random(); 
var a = Enumerable.Range(0, 3).Select(i => r.Next(0, 11));
Console.WriteLine(a.Aggregate(string.Empty, (x, y) => x += y + " "));
Console.WriteLine(a.Distinct().Count() < 3 ? "You win" : "You lose");
И она даже работает. Почти всегда правильно. Но иногда бывает и вот так:Собссно вопрос: почему? Что я упустил? .net 8.0, консолька.

Вангую, что дело в отложенных вычислениях, но почему они выполняются 2 раза? Такое впечатление, что я какое-то замыкание сочинил нечаянно таким образом. Если коллекцию превратить в массив, допустим, то эффект пропадает.
2 ответа
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (248298) 3 недели назад
затолкнуть всё в ленивый поток

 using System; 
using System.Linq;

class Program
{
static void Main()
{
Random r = new Random();

bool isWin = Enumerable.Range(0, 3)
.Select(_ =>
{
int randomNumber = r.Next(0, 11);
Console.Write(randomNumber + " ");
return randomNumber;
})
.Distinct()
.Count() < 3;

Console.WriteLine(isWin ? "You win" : "You lose");
}
}
Jurijus ZaksasИскусственный Интеллект (429974) 3 недели назад
Хитрая ты попа. Да, в этом случае все будет проделано один раз.
Но вопрос-то был в том, почему у меня такие спецэффекты, а не как их избежать...
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (248298) Jurijus Zaksas, предположительно: генерация a.Distinct().Count() выполняется каждый раз заново... вне потока
Александр Просветленный (20886) 3 недели назад
Это связано с отложенным вычислением и результат в переменной 'a' пересчитывается каждый раз с новым обращением. И вы сами ответили на свой вопрос, как это решить. Используйте ToArray или ToList.
Похожие вопросы