Max*_*ich 2 c# comparison lambda extension-methods guid
我试图创建一个看起来像这样的扩展方法......
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> value, IEnumerable<T> compareTo, Func<T, object> compareFieldPredicate)
{
return value.Where(o => !compareTo.Exists(p => compareFieldPredicate.Invoke(p) == compareFieldPredicate.Invoke(o)));
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,我可以做这样的事......
IEnumerable<MyCollection> distinctValues = MyCollection.Distinct(MyOtherCollection, o => o.ID); //Note that o.ID is a guid
Run Code Online (Sandbox Code Playgroud)
现在,在这一点上,我本来希望只有我的不同物品归还给我,但我发现从来没有这样.
进一步研究使用以下代码分解此方法.
Guid guid1 = Guid.NewGuid();
Guid guid2 = new Guid(guid1.ToString());
Func<MyObject, object> myFunction = o => o.ID;
Func<MyObject, object> myFunction1 = o => o.ID;
bool result = myFunction(MyObject) == myFunction1(MyObject);
//result = false
Run Code Online (Sandbox Code Playgroud)
我发现即使Guids是相同的,比较也总是返回false.
这是什么原因?
你的问题是你在比较之前将Guids装入对象.考虑以下代码:
Guid g1 = Guid.NewGuid();
var g2 = g1;
Console.WriteLine(g1 == g2);
object o1 = g1;
object o2 = g2;
Console.WriteLine(o1 == o2);
Run Code Online (Sandbox Code Playgroud)
这实际上输出:
true
false
Run Code Online (Sandbox Code Playgroud)
由于"o1"和"o2"虽然等于同一个Guid,但不是同一个对象.
如果你真的希望你的"Distinct"扩展方法不依赖于特定类型(如Guid),你可以这样做:
public static IEnumerable<TItem> Distinct<TItem, TProp>(this IEnumerable<TItem> value, IEnumerable<TItem> compareTo, Func<TItem, TProp> compareFieldPredicate)
where TProp : IEquatable<TProp>
{
return value.Where(o => !compareTo.Any(p => compareFieldPredicate(p).Equals(compareFieldPredicate(o))));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3337 次 |
最近记录: |