Я попытался создать метод расширения, который выглядит следующим образом ...Неожиданное поведение при сравнении GUIDs в .NET
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)));
}
Идея заключается в том, что я мог бы сделать что-то вроде этого ...
Теперь на этом этапе я ожидал вернуть только мои отдельные элементы, но я обнаружил, что это не так.
При дальнейших исследованиях, разрушая этот метод, используя следующий код.
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
Я нашел этот факт, даже если Гиды совпадают, сравнение всегда будет возвращать false.
В чем причина этого?
Что 'MyObject'? – reuben
Пользовательский класс, который содержит идентификатор поля типа guid. Извините, если это was not clear ... –
Возможно, я что-то упустил, но если это тип, почему вы передаете его в 'myFunction' или' myFunction1'? – reuben