当前位置: 首页 > 编程语言 > C#

C#3.0:需要从ListShare返回duplicates

时间:2023-04-10 20:08:04 C#

Duplicateobjects。我不需要不同的结果集,我需要一个我将从我的存储库中删除的项目列表。为了这个例子,假设我有一个类型为“汽车”的列表,我需要知道这些汽车中哪一辆与列表中的另一辆汽车颜色相同。以下是列表中的汽车及其颜色属性:Car1.Color=Red;Car2.Color=蓝色;Car3.Color=绿色;Car4.Color=红色;Car5.Color=红色;对于这个例子,我需要结果(IEnumerable、List或其他)来包含Car4和Car5,因为我想从我的存储库或数据库中删除它们,这样我的存储库中每种颜色只有一辆车。任何帮助将不胜感激。我昨天在尝试写一个“与投影截然不同”时不小心编码了这个。我加了一个!当我不应该,但这次做对了:publicstaticIEnumerableDuplicatesBy(thisIEnumerablesource,FunckeySelector){foreach(TSourceelementinsource){//如果键实际上没有被添加则产生它-即它//已经在集合中if(!seenKeys.Add(keySelector(element))){yieldreturnelement;}}}然后你调用它:varduplicates=cars.DuplicatesBy(car=>car.Color);varduplicates=fromcarincarsgroupcarbycar.Colorintogroupedfromcaringrouped.Skip(1)selectcar;这按颜色对汽车进行分组,然后跳过第一个结果,将每个组中的其余部分分组为一个序列。如果您对保留哪一辆有特定要求,例如,如果一辆汽车具有Id属性并且您希望保留具有最低Id的汽车,那么您可以在那里添加一些排序,例如varduplicates=fromcarincarsgroupcarbycar.Colorintogroupedfromcaringrouped.OrderBy(c=>c.Id).Skip(1)选择汽车;这是一个略有不同的Linq解决方案,我认为它使您尝试做的事情更加明显:vars=fromcarincarsgroupcarbycar.Colorintogwhereg.Count()==1selectg.First();它只是按颜色对汽车进行分组,丢弃所有具有多个元素的组,然后将其余组件放入返回的IEnumerable中。IEnumerableGetDuplicateColors(Listcars){returncars.Where(c=>cars.Any(c2=>c2.Color==c.Color&&cars.IndexOf(c2)这基本上意味着“返回火车中的任何一辆车Car,相同颜色,较小的索引”。虽然不确定性能。我怀疑使用O(1)查找重复项(如字典/哈希集方法)对于大型集合可能更快。创建一个新的DictionaryfoundColors和AListcarsToDelete然后你迭代在你原来的汽车列表上这样:然后你可以删除foundColors中的每辆车。你可以通过在if语句中添加“删除记录”逻辑而不是创建一个新列表来获得轻微的性能提升,但是你的问题的方式表明你需要将它们收集在一个列表中。没有实际编码,算法如下:字典中留下的任何内容都有重复项。当然,实际删除的第二部分是可选的。您可以遍历Dictionary并查找>1以采取行动。编辑:好的,我在给你代码后遇到了Ryan。;)我的回答受到受访者的采访者的启发(按顺序):JoeCoehoorn、GregBeech和JonSkeet。我决定提供一个完整的示例,假设(为了实际效率)您有一个静态的汽车颜色列表。我相信以下代码以优雅但不一定超高效的方式说明了问题的完整解决方案。#regionSearchForNonDistinctMembersInAGenericListSamplepublicstaticstring[]carColors=new[]{"Red","Blue","Green"};publicstaticstring[]carStyles=new[]{"Compact","Sedan","SUV","Mini-Van","Jeep"};publicclassCar{publicCar(){}publicstringColor{get;放;}publicstringStyle{get;放;}}publicstaticListSearchForNonDistinctMembersInAList(){//正常传递汽车,但为了简洁在这里声明varcars=newList(5){newCar(){Color=carColors[0],Style=carStyles[0]},newCar(){Color=carColors[1],Style=carStyles[1]},newCar(){Color=carColors[0],Style=carStyles[2]},newCar(){Color=carColors[2]],Style=carStyles[3]},newCar(){Color=carColors[0],Style=carStyles[4]}};列出carDupes=newList();for(inti=0;idupeMatcher=c=>c.Color==carColors[i];intcount=cars.Count(dupeMatcher);if(count>1)//我们有重复项{foreach(Cardupeincars.Where(dupeMatcher).Skip(1)){car??Dupes.Add(dupe);}}}返回rncarDupes;}#endregion稍后我会回过头来将此解决方案与其所有三个灵感进行比较,以对比样式这很有趣。publicstaticIQueryableDuplicates(此IEnumerable的来源)whereTSource:IComparable{if(source==null)thrownewArgumentNullException("source");返回source.Where(x=>source.Count(y=>y.Equals(x))>1).AsQueryable();}以上就是C#学习教程:C#3.0:需要返回List中的重复项,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关照——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: