Проверьте, имеет ли значение nullable boolean значение и равны ли все из списка - PullRequest
2 голосов
/ 24 января 2012

У меня есть логическое свойство обнуляемого объекта внутри списка, я хочу проверить, все ли равны, и вернуть его значение, и вернуть ноль, если есть значение, которое не равно.

например

Object1
    string Name
    bool? NullBool

Объект1 находится в списке, например, List<Object1>, и мне просто нужно проверить и вернуть NullBool, используя Linq

Я хочу сделать что-то вроде

bool? returnVal = <my Linq / Function to get what I want>

Ответы [ 4 ]

3 голосов
/ 24 января 2012
var result = list.Select(elem => elem.NullBool).DefaultIfEmpty()
                 .Aggregate((acc, elem) => acc == elem ? acc : null);
3 голосов
/ 24 января 2012

Не красиво, но:

IEnumerable<Object1> objects = ...

var firstTwoDistinctValues = objects.Select(o => o.NullBool)
                                    .Distinct()
                                    .Take(2) // Early exit
                                    .ToList();

var result = firstTwoDistinctValues.Count == 2
             ? null : firstTwoDistinctValues.SingleOrDefault();

Теперь это довольно эффективно, потому что:

  • Работает без перечисления исходной коллекции более одного раза. Это не такая большая проблема, когда источником является список, но может быть важно, если источником является дорогой / недетерминированный запрос.
  • Это выходит рано, если есть больше, чем уникальное значение.

Кроме того, он будет работать нормально, если исходная коллекция пуста.

Для списка, вы также можете эффективно сделать:

IList<Object1> objects = ...

var firstNullBool = objects.Select(o => o.NullBool).FirstOrDefault();
var result = objects.All(o => o.NullBool == firstNullBool) ? firstNullBool : null;
0 голосов
/ 24 января 2012
var thing = (from x in objects where (x.NullBool.HasValue 
   && x.NullBool.Value == whatever) select x).FirstOrDefault()
0 голосов
/ 24 января 2012

Думаете ли вы о чем-то подобном?

public static bool? CheckIfAllAreTheSame(List<Object1> bools)
{
    if (bools.All(b => b.NullBool == true))
        return true; // ... they are all true;
    if (bools.All(b => b.NullBool == false))
        return false;// ... they are all false
    return null;// ... they are not all the same...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...