汗颜,最近在看linq,发现个无法理解的东西

jiaxinglei01 2020-12-16 04:26:57
最近学习linq,本来是想用linq把2个List去重。

自己写的是 list1.RemoveAll(m=> list2.FindIndex(n=>n.name== m.name) > 0);
发现只能去除1行,想知道怎么写比较好。
然后看到个取交集的写法:var list = list1.Where((x, i) => list2.FindIndex(z => z.name== x.name) == i).ToList(); 这个方法是获取交集,蛋疼的是看不懂 i这个参数的作用,特请教一下大家
...全文
2138 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2020-12-17
  • 打赏
  • 举报
回复
移上去有说明,也可以百度
weixin_44111953 2020-12-17
  • 打赏
  • 举报
回复
学习学习111111111
正怒月神 2020-12-17
  • 打赏
  • 举报
回复
// predicate: // A function to test each source element for a condition; the second parameter // of the function represents the index of the source element. public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate); 翻译: //谓词: //测试每个源元素的条件的函数; //第二个参数的表示源元素的索引
bloodish 2020-12-17
  • 打赏
  • 举报
回复
引用 6 楼 jiaxinglei01 的回复:
[quote=引用 2 楼 bloodish 的回复:]

//合并+去重
list1.Concat(list2).Distinct().ToList();
//交集
list1.Intersect(list2).ToList();
//差集,去除list1中同list2的element
list1.Except(list2).ToList();
数据来源不同的, 你这样去除是应该根据hashcode比较的,应该不是我要的效果[/quote] 如果你只是想根据list2将list1进行去重,那么Except就是你想要的,但是你的n的类型是怎么定义的呢? 假设是:

        public class Data
        {
            public string Name { get; set; }

            public override int GetHashCode() => Name.GetHashCode();

            public override bool Equals(object obj) => (obj is Data n && n.Name == Name);
        }
完全就可以用一句linq来满足你的需求,重写GetHashcode和Equals又有什么关系呢?
list1.Except(list2)
Denuin多啦咧梦 2020-12-17
  • 打赏
  • 举报
回复
引用 5 楼 jiaxinglei01 的回复:
[quote=引用 1 楼 Denuin 的回复:]list1.RemoveAll( m=>list2.FindAll( n=>n.name==m.name)) 这句不知道是不是你想要的结果。 Linq还有很多更无法理解的东西,加油!
报错的[/quote] 其实你没有说明list1和list2是不是同一类型的。 如果类型相同,可以求并集后去重:

var lstq = list1.Union(list2);  // 并集
var result = lstq.Distinct();   // 去重
不过这样就没有Linq的事了
jiaxinglei01 2020-12-17
  • 打赏
  • 举报
回复
多谢各位指教,已请教清楚了
jiaxinglei01 2020-12-17
  • 打赏
  • 举报
回复
引用 10 楼 bloodish 的回复:
[quote=引用 6 楼 jiaxinglei01 的回复:][quote=引用 2 楼 bloodish 的回复:]

//合并+去重
list1.Concat(list2).Distinct().ToList();
//交集
list1.Intersect(list2).ToList();
//差集,去除list1中同list2的element
list1.Except(list2).ToList();
数据来源不同的, 你这样去除是应该根据hashcode比较的,应该不是我要的效果[/quote] 如果你只是想根据list2将list1进行去重,那么Except就是你想要的,但是你的n的类型是怎么定义的呢? 假设是:

        public class Data
        {
            public string Name { get; set; }

            public override int GetHashCode() => Name.GetHashCode();

            public override bool Equals(object obj) => (obj is Data n && n.Name == Name);
        }
完全就可以用一句linq来满足你的需求,重写GetHashcode和Equals又有什么关系呢?
list1.Except(list2)
[/quote] 抱歉没说明白,2个List根据Name去重,其他字段值是不一样的
八爻老骥 2020-12-16
  • 打赏
  • 举报
回复
首先,list2.FindIndex()返回的是list2的下标,应该是从0开始的:
list1.RemoveAll(m=> list2.FindIndex(n=>n.name== m.name) > -1);
按道理这样写没啥问题的,至少在我的电脑上是运行正确的。需要看下两个list的实际内容,可能数据有问题。

Bridge_go 2020-12-16
  • 打赏
  • 举报
回复
看图都没问题的
jiaxinglei01 2020-12-16
  • 打赏
  • 举报
回复
引用 2 楼 bloodish 的回复:

//合并+去重
list1.Concat(list2).Distinct().ToList();
//交集
list1.Intersect(list2).ToList();
//差集,去除list1中同list2的element
list1.Except(list2).ToList();
数据来源不同的, 你这样去除是应该根据hashcode比较的,应该不是我要的效果
jiaxinglei01 2020-12-16
  • 打赏
  • 举报
回复
引用 1 楼 Denuin 的回复:
list1.RemoveAll( m=>list2.FindAll( n=>n.name==m.name)) 这句不知道是不是你想要的结果。 Linq还有很多更无法理解的东西,加油!
报错的
正怒月神 2020-12-16
  • 打赏
  • 举报
回复
你把鼠标移动到 i 上,就知道了。
qq_17510559 2020-12-16
  • 打赏
  • 举报
回复
var list = list1.Where((x, i) => list2.FindIndex(z => z.name== x.name) == i).ToList(); x是list1的元素 i是元素的下标 如果list1跟list2相同元素的下标不一致,这段代码应该无法获取到交集
bloodish 2020-12-16
  • 打赏
  • 举报
回复

//合并+去重
list1.Concat(list2).Distinct().ToList();
//交集
list1.Intersect(list2).ToList();
//差集,去除list1中同list2的element
list1.Except(list2).ToList();
Denuin多啦咧梦 2020-12-16
  • 打赏
  • 举报
回复
list1.RemoveAll( m=>list2.FindAll( n=>n.name==m.name)) 这句不知道是不是你想要的结果。 Linq还有很多更无法理解的东西,加油!

111,109

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧