Это все может быть сделано с помощью linq, но, вероятно, это никогда не будет самым эффективным способом, потому что вам нужно перечислять не раз, или другим шенинганам.Иногда лучшим подходом является простой старый код.
public static bool? CantFindAgoodName(IEnumerable<bool?> items)
{
bool? check = null;
bool first = true;
foreach(var item in items)
{
if(first)
{
check = item;
first = false;
}
else if(check != item)
return null;
}
return check;
}
Тогда просто напишите
BoolProperty = CantFindAGoodName(g)
Если вы действительно хотите сделать это со стандартным Linq, это можно сделать за одну итерацию, но егони эффективный (потому что он не ломается сразу), ни beatuiful ...
BoolProperty = g.Aggregate(-1,
(n, b) => n == -1
? (b == null ? 0 : (b.Value ? 1 : 2))
: (n == (b == null ? 0 : (b.Value ? 1 : 2)) ? n : -2),
i => i == -2 ? default(bool?) : i == 1);
Так как это работает?
-1 = seed
0 = null
1 = true
2 = false
-2 = different values aka null
Хотя значение является первым или равно его предшественнику, оно продолжает передаваться.Поэтому, если последовательность состоит исключительно из одного и того же элемента, он будет перенаправлен.Если он отличается, однако, -2 будет перенаправлено, что всегда будет отличаться от любого другого оставшегося элемента.В конце вторая лямбда просто преобразует результат обратно в bool?