1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 在c#中 筛选一个List中的每个元素的开头或结尾是否包含另一个List的元素(StartWith(

在c#中 筛选一个List中的每个元素的开头或结尾是否包含另一个List的元素(StartWith(

时间:2019-12-14 05:12:27

相关推荐

在c#中 筛选一个List中的每个元素的开头或结尾是否包含另一个List的元素(StartWith(

前段时间在开发的过程中遇到这样一个问题,分别有两个List集合,其中一个为固定列表,另一个需要动态加载。最终结果需要对动态列表进行筛选,保留每个元素开头包含在固定列表中。

下面我以NBA球队为例,给定一个固定的球队列表:

var teamList = new List<string> { "湖人","凯尔特人","快船","雷霆","勇士",};

目前我有一个动态加载的球员名单(由于下文需要测试效率,所以添加的样本比较多):

var playerNameList = new List<string> {"湖人-科比","快船-保罗乔治","湖人-勒布朗","凯尔特人-塔图姆","勇士-汤普森","雷霆-维斯布鲁克","凯尔特人-杰伦布朗","快船-雷吉杰克逊","快船-莱昂纳德","马刺-邓肯","马刺-吉诺比利","马刺-波波维奇","雷霆-杜兰特","湖人-安东尼","雷霆-哈登","勇士-库里","勇士-格林","湖人-加索尔","快船-伊巴卡","凯尔特人-斯玛特","湖人-安东尼戴维斯","火箭-姚明","开拓者-利拉德","公牛-德罗赞","掘金-约基奇","雄鹿-字母哥","篮网-欧文","尼克斯-兰德尔","热火-韦德","太阳-保罗",};

想要快速获取到给定球队名单中每个球队都有哪些球员,首先我们可以通过for循环的方式实现:

var retList = new List<string>();​var startTime = DateTime.Now;​Console.WriteLine($"foeach开始时间:{ startTime}");foreach (var item in teamList){retList.AddRange(playerNameList.Where(r => r.StartsWith(item)));}var endTime = DateTime.Now;Console.WriteLine($"foreach结束时间:{ endTime}");foreach (var item in retList){Console.WriteLine(item);}Console.WriteLine($"耗时:{endTime - startTime}");

输出结果如下:

foreach循环虽然可以完美实现,但是在使用linq的时候我们要做到尽量简洁,并且foreach的效率比较底下,linq也提供给我们StartWith()方法,具体写法如下:

var startTime = DateTime.Now;Console.WriteLine($"linq开始时间:{ startTime}");var retList = playerNameList.Where(w => teamList.Any(a => w.StartsWith(a))).ToList(); var endTime = DateTime.Now;Console.WriteLine($"linq结束时间:{ endTime}");foreach (var item in retList){Console.WriteLine(item);}Console.WriteLine($"耗时:{endTime - startTime}");

输出结果如下:

精华代码:

var retList = playerNameList.Where(w => teamList.Any(a => w.StartsWith(a))).ToList();

我们再来对比下foreach和linq实现的效率:

虽然样本并不大,但很明显可以看出StartWith()的效率要远高于for循环,并且代码既干净又清爽。以上。

一个简单知识点分享给大家,破天荒头一回更新,希望各位大佬多多包涵!!!

在c#中 筛选一个List中的每个元素的开头或结尾是否包含另一个List的元素(StartWith()的使用)...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。