c# – 用于对比不同对象的Lambda表达式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 用于对比不同对象的Lambda表达式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1767字,纯文字阅读大概需要3分钟。
内容图文
我有两个列表,一个是联系人,另一个是员工.我想生成非员工的联系人子集.以下表达式似乎可以告诉我,有些联系人不是员工,现在我需要一个符合该条件的联系人列表:
if(myContacts.Select(c=>c.contactID).Except(employees.Select(e=>e.contactID)).Any()
{
//get the subset of contacts and do stuff to them....
}
TIA!
罗恩
解决方法:
如果您的员工和联系人序列是相同的类型对象(或者两者都继承自相同类型,如Contact),那么您可以创建EqualityComparer实例:
public class ContactComparer : EqualityComparer<Contact>
{
public override bool Equals(Contact x, Contact y)
{
if (ReferenceEquals(x, y)) return true;
return x != null && y != null && x.ContactId == y.ContactId;
}
public override int GetHashCode(Contact obj)
{
if (obj == null) throw new ArgumentNullException("obj");
// assuming string
return (obj.ContactId ?? "").GetHashCode();
}
}
哪个可以让你这样做,因此你可以直接返回结果而不必双重查询:
var contactsNotEmployees = myContacts.Except(employees, new ContactComparer()).ToList();
更新:如您的注释所示,Contact和Employee是不同的类型,您可以考虑使用ContactId属性创建一个接口来创建公共绑定.
或者,我建议将您的except结果导出到HashSet,然后使用HashSet中的Contains(),这是O(1)效率(而不是序列上的Contains(),这是O(n)效率):
// get hash set of contact-only IDs
var except = new HashSet<int>(contacts
.Select(c => c.ContactId)
.Except(emplopyees.Select(e => e.ContactId)));
// get the objects for those IDs
var others = contacts.Where(c => except.Contains(c.ContactId)).ToList();
比较使用序列Contains()和HashSet Contains()的结果,对于小列表(15个项目),你的速度提高了约50%,对于更长的列表,速度更快.
无论如何,只是抛出那个,因为序列上的Contains()(IEnumerable< T>)相对较慢……
我为两个解决方案计时超过1,000,000次迭代并获得:
HashSet With Contains() took: 1429 ms, 0.001429 ms/item.
Sequence With Contains() took: 3386 ms, 0.003386 ms/item.
内容总结
以上是互联网集市为您收集整理的c# – 用于对比不同对象的Lambda表达式全部内容,希望文章能够帮你解决c# – 用于对比不同对象的Lambda表达式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。