两个List< string>比较是否相同的N种方法,你用过哪种?

共 2219字,需浏览 5分钟

 ·

2020-11-28 18:32

2020-11-23 6:59:09

说明:
昨天发布本文,经由网友验证,文中lambda的方法有误,文中飘红的地方进行说明,误人子弟了,对不起大家,在此悔过!!!在此,也十分感谢网友认真阅读了本文,还动手进行了验证,站长羞愧之时也十分感动,谢谢!

正文开始:
今天在一技术群看一群大佬讨论:

有没有优雅的写法,比较两个List集合中的元素是不是完全一致...

话题

站长最近也无聊,通过群里的聊天记录和给出的参考链接,简单做做总结,万一后面大家能用上呢?

我们做简单点,通过多种方式比较两个列表长度、所包含元素是否相等,不考虑顺序。

给出下面两个列表,按比较要求,两个列表是相等的(11-23,每个列表增加一个重复的元素"3",昨天的样例元素未考虑重复):

List<string> lst1 = new List<string> { "2""3""1""3" };
List<string> lst2 = new List<string> { "3""1""3""2" };

方法一

由勤快哥给出的建议:排序后,通过string.join的方法转换为两个字符串后再比较,下面是代码:

Console.WriteLine("列表排序转换为字符串再比较");

lst1.Sort();
lst2.Sort();
var lstStr1 = string.Join(',',lst1);
var lstStr2 = string.Join(',', lst2);
bool isEquals = lstStr1.Equals(lstStr2);  // true

Console.WriteLine($"两者排序后通过(string.Join)转换为字符串:{isEquals}\r\n\r\n");

方法二和方法三由群里的tim大佬给的 stackoverflow 问题截图而来。

方法二

相较上面将列表转换字符串的方式,方法二简单点,排序后,使用SequenceEqual方法比较。

Console.WriteLine("使用Linq比较两个列表是否相等");
bool isEquals = Enumerable.SequenceEqual(lst1, lst2);  // false

Console.WriteLine($"两者直接通过(Enumerable.SequenceEqual(lst1, lst2))比较:{isEquals}");

// 1、集合排序再比较
lst1.Sort();
lst2.Sort(); 
isEquals = Enumerable.SequenceEqual(lst1, lst2);      // true

// 2、或者使用Linq的方式排序后再比较,一行代码的事儿
//isEquals = lst1.OrderBy(a => a).SequenceEqual(lst2.OrderBy(a=>a));  // true

Console.WriteLine($"两者排序后通过(Enumerable.SequenceEqual(lst1, lst2))比较:{isEquals}\r\n\r\n");

方法三

使用Lambda表达式,先取两列表的相同元素,然后将结果与列表1、列表2个数进行比较得到最终结果,代码如下:

下面的方法比较结果为false,站长未测试重复元素,对大家产生了主导,抱歉!

Console.WriteLine("使用Lambda表达式比较两个列表是否相等");

var q = from a in lst1
        join b in lst2 on a equals b
        select a;

var isEquals = ((lst1.Count == lst2.Count) 
                && (q.Count() == lst1.Count));  // true,这里应该返回false,大家可以尝试下

Console.WriteLine($"两者通过Lambda表达式比较:{isEquals}\r\n\r\n");

以上三种方法(纠正:第三种不行,具体的大家可以跑下上面的例子,一和2两种方法可行,都能得到最终比较结果,更多的方法,请查看下面由tim大佬搜索提供的链接(下面的链接,评论有指出方法三的问题,站长未细看,导致发了一篇错文误导了大家,抱歉,以后发文一定将样例考虑周全。)

https://stackoverflow.com/questions/649444/testing-equality-of-arrays-in-c-sharp

更多方式







回复 【关闭】广
回复 【实战】获取20套实战源码
回复 【被删】
回复 【访客】访
回复 【小程序】学获取15套【入门+实战+赚钱】小程序源码
回复 【python】学微获取全套0基础Python知识手册
回复 【2019】获取2019 .NET 开发者峰会资料PPT
回复 【加群】加入dotnet微信交流群

副业刚需,没有人能拒绝这个网站!


微信钱包“免费提现”的方法来了!


浏览 176
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报