我有一行代码:
bool true/false = array1.All(a => array2.Any(t => t.field == a.field));
我不明白所有+任何组合。
是否意味着'没有array1的字段等于array2的任何字段'然后返回true?
这与array1.Except(array2).Any();
不一样吗?
更新
我不小心把“!”在.Any()!!!
之前答案 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
中至少有一个元素不存在,则返回Truearray2
现在给出你的上下文,如果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)
总之,您的第一个解决方案是检查array1
中field
中的所有元素是否在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
中的示例