到目前为止,我已经想出了这个:
list.Any(s => s.EnumIdValue == Close) && !list.Any(s => s.EnumIdValue == Reset || s.EnumIdValue == Cancel);
EnumIdValue包含几个不同的可能值,如关闭,重置,取消,SomeOtherState等。不应该有重复,但它仍然可能。
这正是我想要的。但是有没有更好(更短)的方式来编写这个查询?
答案 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);