什么意味着结合All with Any LINQ查询

时间:2016-12-01 21:47:52

标签: c# linq

我有一行代码:

bool true/false = array1.All(a => array2.Any(t => t.field == a.field));

我不明白所有+任何组合。

是否意味着'没有array1的字段等于array2的任何字段'然后返回true?

这与array1.Except(array2).Any();不一样吗?

更新

我不小心把“!”在.Any()!!!

之前

3 个答案:

答案 0 :(得分:1)

这意味着如果array2中没有项目在array1中的所有项目的字段中具有相同的值,则返回true。

更简单的版本:

对于array1中的所有项目,array2中没有具有相同字段值的项目。

更新:

现在修改后的版本要简单得多,因为如果对于array1中的所有项目,array2中的项目具有相同的字段值,则返回true。

答案 1 :(得分:1)

我认为它们真的不同,它还取决于你array的结构。如果它只有field属性,或者它也有其他属性。

代码检查

array1.All(a => array2.Any(t => t.field == a.field));
  

返回true如果对于array1中的每个元素,array2中的至少一个元素具有   field属性的相同值

array1.Except(array2).Any();
  

如果array1中至少有一个元素不存在,则返回True   array2

现在给出你的上下文,如果field是你结构的唯一属性,它会产生相同的结果,但如果还有其他事情发生则不会。

例如

struct Test
{
  public string int { get; set; }
  public string int { get; set; }
}

//...

var array1 = new Test[] 
{
  new Test { Field = 0, OtherField = 1 },
  new Test { Field = 1, OtherField = 2 }
}

var array2 = new Test[] 
{
  new Test { Field = 0, OtherField = 1 },
  new Test { Field = 2, OtherField = 2 }
}

第一种情况:对于array1的每个元素,array2中的至少一个元素在字段属性中的值是否相同?的

第二种情况array1中至少有一个array2元素不存在?的

答案 2 :(得分:0)

总之,您的第一个解决方案是检查array1field中的所有元素是否在array2中的某个元素中具有相同的var areContained =!array1.Select(e=>e.field)).Except(array2.Select(d=>d.field)).Any(); 值,这些元素也可以转换为:

HashSet<int> hashSet = new HashSet<int>(array2.Select(d=>d.field));//Superset
bool contained = array1.Select(e=>e.field)).All(i => hashSet.Contains(i));

另一个变体可能是使用散列,如果超集太大,可能有助于提高效率:

resVec.insert(frontIter , vec[idx]);

在您的替代方案中,您使用默认的相等比较器基于数组的对象实例进行比较,这样可以产生完全不同的结果。看看这个link

中的示例