使用linq检查DTO列表,查看排除特定值的所有值是否都等于

时间:2018-03-27 22:19:46

标签: c# .net linq

我有一个充满价值的DTO列表。我想检查所有DTO中的某个值是否相同,同时排除特定值。换句话说,我需要获取此列表的子集,然后检查所有值是否相等。

我最初尝试过

itemList.Where(x => x.status != 17).All(x => x.status == 15)

但是当列表中的所有DTO的状态= 17时,它正在评估为真。我想得到一个没有状态17的DTO子集,然后检查所有这些DTO的状态是否为15.什么是最好的方法吗?

3 个答案:

答案 0 :(得分:2)

我相信您的要求是:

  1. 忽略Status = 17
  2. 的任何内容
  3. 在剩余记录中,确保它们都具有15
  4. 的状态
  5. 确保至少有一条记录
  6. 我相信可以用

    完成
    bool ok = itemList
        .Select( x => x.Status )   //Just look at statuses
        .Where( x => x != 17)      //Ignore 17
        .Distinct()                //Collapse to one element per status
        .SingleOrDefault()         //Make sure there is only one element
        == 15;                     //Make sure the status is 15
    

答案 1 :(得分:1)

.All检查是否没有无法满足条件的元素。所以它为空集返回true

如果我理解你的意图,你可以尝试

itemsList.Count(i => i.status != 17 && i.status != 15) > 0;

即。只需过滤掉所有的17和15,看看是否还剩下其他东西。

答案 2 :(得分:1)

听起来这个问题可能会对如何处理空集合感到困惑。我发现将源分区为子集合可以使任何决策都清晰。

var lookup = itemsList.ToLookup(x =>
  x.Status == 17 ? "Exclude" :
  x.Status == 15 ? "Include" :
  "Trouble");

bool hasTrouble = lookup["Trouble"].Any();
bool hasInclude = lookup["Include"].Any();
bool hasOnlyGoodOnes = !hasTrouble && hasInclude;
var goodOnes = lookup["Include"].ToList();