List.Find<T>()返回null,即使谓词匹配。

6
我会在这里附上一张图片作为参考。我被难住了。在调试器中,这些值肯定是相等的,但是Find<T>仍然返回null,而Exists<T>仍然返回false。供参考:UserRepository实现了IEnumerable<T>,其中TDomainUser

尝试将其转换为字节数组并检查字节码。我猜其中一个附加了“0”字节。 - Alex
2个回答

13
问题在于CommandArgument的类型是object,因此它执行的是引用标识检查。 (我很惊讶这没有给你编译时警告。)您可以将CommandArgument强制转换为string,或使用Equals
u => u.Username == (string) args.CommandArgument
或者
u => Equals(u.Username, args.CommandArgument)

(使用静态的Equals方法这样做意味着它甚至可以处理具有null用户名的用户,不像u.Username.Equals(args.CommandArgument)。)

不过我不会把序列转换为列表 - 我会使用LINQ代替:

DomainUser toRemove =
    repo.FirstOrDefault(u => u.Username == (string) args.CommandArgument);

感谢您指出我可以在不调用ToList的情况下使用FirstOrDefault。我想我只看了Control上的CommandArgument类型(它是String),而没有看RepeaterCommandEventArgs - tuespetre

5

您尝试过以下方法吗:

u.Username.Equals(args.CommandArgument)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接