您可以使用MoreLINQ和ExceptBy
:
dInfoB = dInfoB.ExceptBy(dInfoA, n => n.FullName,
StringComparer.InvariantCultureIgnoreCase).ToArray();
如果您无权访问 MoreLINQ,您也可以使用这种(稍微)效率较低的方式:
dInfoB = dInfoB.Except(dInfoA,
PropertyEqualityComparer.GetNew<DirectoryInfo, string>
(n => n.FullName, StringComparer.InvariantCultureIgnoreCase)).ToArray();
仍然比Where
+更有效率Any
。
如果我得到你想要做的事情。额外的比较器是因为 DirectoryInfo 决定它不想覆盖Equals
.
比较器是这样的:
public class PropertyEqualityComparer<TObject, TProperty>
: IEqualityComparer<TObject>
{
Func<TObject, TProperty> _selector;
IEqualityComparer<TProperty> _internalComparer;
public PropertyEqualityComparer(Func<TObject, TProperty> propertySelector,
IEqualityComparer<TProperty> innerEqualityComparer = null)
{
_selector = propertySelector;
_internalComparer = innerEqualityComparer;
}
public int GetHashCode(TObject obj)
{
return _selector(obj).GetHashCode();
}
public bool Equals(TObject x, TObject y)
{
IEqualityComparer<TProperty> comparer =
_internalComparer ?? EqualityComparer<TProperty>.Default;
return comparer.Equals(_selector(x), _selector(y));
}
}