如何通过 Linq 踢掉 List 中的重复记录 ?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了 如何通过 Linq 踢掉 List 中的重复记录 ?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2504字,纯文字阅读大概需要4分钟。
内容图文
![如何通过 Linq 踢掉 List 中的重复记录 ?](/upload/InfoBanner/zyjiaocheng/993/66bb503e893c4fffb40cc334b1767551.jpg)
咨询区
Prasad:
我有一个 Items 类,定义如下:
????class?Items
????{
????????public?int?Id?{?get;?set;?}
????????public?string?Name?{?get;?set;?}
????????public?int?Code?{?get;?set;?}
????????public?decimal?Price?{?get;?set;?}
????}
现在 List<Items>
中包含了重复的数据,比如下面这样。
1?????????Item1???????IT00001????????$100
2?????????Item2???????IT00002????????$200
3?????????Item3???????IT00003????????$150
1?????????Item1???????IT00001????????$100
3?????????Item3???????IT00003????????$150
请问我如何通过 linq 的方式剔除重复记录呢 ?
回答区
Christian Hayter:
你的这种情况需要给 Items
一个自定义比较器,参考如下代码。
class?DistinctItemComparer?:?IEqualityComparer<Item>?{
????public?bool?Equals(Item?x,?Item?y)?{
????????return?x.Id?==?y.Id?&&
????????????x.Name?==?y.Name?&&
????????????x.Code?==?y.Code?&&
????????????x.Price?==?y.Price;
????}
????public?int?GetHashCode(Item?obj)?{
????????return?obj.Id.GetHashCode()?^
????????????obj.Name.GetHashCode()?^
????????????obj.Code.GetHashCode()?^
????????????obj.Price.GetHashCode();
????}
}
有了这个比较器,后面就方便了。
var?distinctItems?=?items.Distinct(new?DistinctItemComparer());
Salah Akbari:
我觉得有三种方式可以删除 List 中的重复记录。
-
使用自定义的比较器,就像楼上那哥们说的。
-
使用
GroupBy
,把 Items 的所有属性名灌到匿名类型上,操作手法如下:
List<Item>?a?=?new?List<Item>
{
????new?Item?{Id?=?1,?Name?=?"Item1",?Code?=?"IT00001",?Price?=?100},
????new?Item?{Id?=?2,?Name?=?"Item2",?Code?=?"IT00002",?Price?=?200},
????new?Item?{Id?=?3,?Name?=?"Item3",?Code?=?"IT00003",?Price?=?150},
????new?Item?{Id?=?1,?Name?=?"Item1",?Code?=?"IT00001",?Price?=?100},
????new?Item?{Id?=?3,?Name?=?"Item3",?Code?=?"IT00003",?Price?=?150},
????new?Item?{Id?=?3,?Name?=?"Item3",?Code?=?"IT00004",?Price?=?250}
};
var?distinctItems?=?a.GroupBy(c?=>?new?{?c.Id?,?c.Name?,?c.Code?,?c.Price})
?????????????????????.Select(c?=>?c.First()).ToList();
- 重写 Equals 和 GetHashCode 方法。
public?class?Item
{
????public?int?Id?{?get;?set;?}
????public?string?Name?{?get;?set;?}
????public?string?Code?{?get;?set;?}
????public?int?Price?{?get;?set;?}
????public?override?bool?Equals(object?obj)
????{
????????if?(!(obj?is?Item))
????????????return?false;
????????Item?p?=?(Item)obj;
????????return?(p.Id?==?Id?&&?p.Name?==?Name?&&?p.Code?==?Code?&&?p.Price?==?Price);
????}
????public?override?int?GetHashCode()
????{
????????return?String.Format("{0}|{1}|{2}|{3}",?Id,?Name,?Code,?Price).GetHashCode();
????}
}
然后就可以直接通过 Distinct()
过滤啦。
var?distinctItems?=?a.Distinct();
点评区
我觉得 Salah Akbari
大佬总结的真到位
内容总结
以上是互联网集市为您收集整理的 如何通过 Linq 踢掉 List 中的重复记录 ?全部内容,希望文章能够帮你解决 如何通过 Linq 踢掉 List 中的重复记录 ?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。