用于在列表中查找一个项目的LINQ查询和验证列表不包含另一个项目

时间:2016-03-03 22:24:14

标签: c# linq

到目前为止,我已经想出了这个:

list.Any(s => s.EnumIdValue == Close) && !list.Any(s => s.EnumIdValue == Reset || s.EnumIdValue == Cancel);

EnumIdValue包含几个不同的可能值,如关闭,重置,取消,SomeOtherState等。不应该有重复,但它仍然可能。

这正是我想要的。但是有没有更好(更短)的方式来编写这个查询?

5 个答案:

答案 0 :(得分:4)

你的原件很好。可行的另一个变体是:

var newQuery =
    list.Any(s => s.EnumIdValue == EnumIdValue.Close) &&
    list.All(s => s.EnumIdValue != EnumIdValue.Reset &&
                  s.EnumIdValue != EnumIdValue.Cancel);

英文:列表中是否至少有一个Close 列表中的每个项目都不是Reset而不是Cancel

顺便说一句,有时格式化代码会在可读性方面产生很大的不同。

答案 1 :(得分:2)

答案是:没有更好的方法来写它。

如果您尝试在一个lambda中编写它,您可以将<?php function get_price_data() { $json = file_get_contents("http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=Chroma%202%20Case"); $decode = json_decode($json,1); echo $decode['median_price']; } $string=get_price_data(); $string2 = str_replace("\u20ac","",$string); echo $string2 * 1000 - 120; ?> 视为列表中的单个项目。如果该项目是s,那么它当然不是别的东西,所以在同一个lambda中检查它是没用的。如果您想检查列表中是否包含其他值,则会强制您使用其他表达式。

答案 2 :(得分:1)

您可以使用HashSet来测试该集合是否包含每个EnumIdValue至少1个

var enumIds = list.Select(s => s.EnumIdValue).ToHashSet();

return enumIds.Contains(Close) && !(enumIds.Contains(Cancel) || enumIds.Contains(Reset));

// or

return enumIds
  .Intersect(new[] { Cancel, Reset, Close })
  .SequenceEqual(new [] { Close });

// or (throws exception)

enumIds.IntersectWith(new[] { Cancel, Reset, Close })
return enumIds.Single() == Close;

如果您需要根据enumIds是否包含Close进行不同类型的检查,这将非常有用。

答案 3 :(得分:0)

怎么样

    var items = list.Select(s => s.EnumIdValue == Close) 
    if(items.Count==1)
    {
       //todo
    }

答案 4 :(得分:0)

这是一个相当可读的选择:

var opts = new [] { Close, Reset, Cancel };
var desired = new [] { Close };
return list
        .Select(s => s.EnumIdValue)
        .Distinct()
        .Where(opts.Contains)
        .SequenceEqual(desired);