ConversionCollection有一组对象。示意图:[{A=1,B=1}{A=1,B=2}{A=2,B=3}{A=2,B=4}{A=1,B=5}{A=3,B=6}]要求:[{A=1,Bs=[1,2]}{A=2,Bs=[3,4]}{A=1,Bs=[5]}{A=3,Bs=[6]}]LINQ可以吗?注意:顺序很重要。所以Bs=[5]不能与Bs=[1,2]合并给定这些简单的类:classC{publicintA;公共诠释B;}类R{publicintA;publicListBs=newList();你可以这样做:varcs=newC[]{newC(){A=1,B=1},newC(){A=1,B=2},newC(){A=2,B=3},newC(){A=2,B=4},newC(){A=1,B=5},newC(){A=3,B=6}};变量rs=cs。OrderBy(o=>oB)。然后通过(o=>oA)。聚合(新列表(),(l,o)=>{如果(l.Count>0&&l.Last()。A==oA){l.Last()。Bs.Add(oB);}其他{l.Add(newR{A=oA,Bs={oB}});}returnl;});上面我假设Bs和As必须排序。如果不是这种情况,删除排序指令很简单:varrs=cs.Aggregate(newList(),(l,o)=>{if(l.Count>0&&l.Last().A==oA){l.Last().Bs.Add(oB);}else{l.Add(newR{A=oA,Bs={oB}});}returnl;});所以基本上你想把具有相同A值的事物组合在一起并且是连续的。您需要将对象列表转换为包含上一个/下一个元素的匿名类型。我用了两个Selects使它更红。然后你需要检查这两个元素是否连续(相邻索引)。现在您拥有了GroupBy、value和bool所需的一切。你的对象:varlist=newSystem.Collections.Generic.List(){newFoo(){A=1,B=1},newFoo(){A=1,B=2},newFoo(){A=2,B=3},newFoo(){A=2,B=4},newFoo(){A=1,B=5},newFoo(){A=3,B=6}};查询:vargroups=list.Select((f,i)=>new{Obj=f,Next=list.ElementAtOrDefault(i+1),Prev=list.ElementAtOrDefault(i-1)}).Select(x=>new{A=x.Obj.A,x.Obj,Consecutive=(x.Next!=null&&x.Next.A==x.Obj.A)||(x.Prev!=null&&x.Prev.A==x.Obj.A)}).GroupBy(x=>new{x.Consecutive,xA});输出:foreach(varabGroupingroups){intaKey=abGroup.Key。A;varbList=string.Join(",",abGroup.Select(x=>x.Obj.B));Console.WriteLine("A={0},Bs=[{1}]",aKey,bList);这是工作演示:http://ideone.com/fXgQ3您可以使用GroupAdjacent扩展方法。然后,你只需要vargrps=objects.GroupAdjacent(p=>new{pA});我认为这是实现它的最简单方法。编辑:这是我的测试代码。类程序{staticvoidMain(string[]args){varia=newDummycls[]{newDummycls{A=1,B=1},newDummycls{A=1,B=2},newDummycls{A=2,B=3},newDummycls{A=2,B=4},newDummycls{A=1,B=5},newDummycls{A=3,B=6},};vargroups=ia.GroupAdjacent(i=>iA);foreach(vargingroups){Console.WriteLine("Group{0}",g.Key);foreach(variing)Console.WriteLine(i.ToString());控制台.WriteLine();}控制台.ReadKey();}}classDummycls{publicintA{get;放;}publicintB{得到;放;}publicoverridestringToString(){returnstring.Format("A={0};B={1}",A,B);}}结果是第1组A=1;B=1A=1;B=2第2组A=2;B=3A=2;B=4第1组A=1;B=5第3组A=3;B=6这是执行您想要的方法的结构:publicstaticIEnumerable>GroupWithKeyBreaks(IEnumerableenumerable,FunckeySelector,FuncitemSelector){//错误处理在这里TKeycurrentKey=default(TKey);列表元素=newList();foreach(可枚举的T元素){TKeythisKey=keySelector(元素);如果(thisKey==null){继续;}if(!thisKey.Equals(currentKey)&&elements.Count>0){yieldreturnnewSimpleGrouping(currentKey,elements);元素=新列表();}elements.Add(itemSelector(元素));当前键=这个键;}//添加“最后一个”项if(elements.Count>0){yieldreturnnewSimpleGrouping(currentKey,elements);}}它使用以下帮助程序类:privateclassSimpleGrouping:IGrouping{privateTkey;私有IEnumerable分组;TIGrouping.Key{get{返回键;}}IEnumeratorIEnumerable.GetEnumerator(){返回分组。GetEnumerator();}System.Collections.IEnumeratorSystem.Collections.IEnumerable.GetEnumerator(){返回分组.GetEnumerator();}publicSimpleGrouping(Tk,IEnumerableg){this.key=k;this.grouping=g;}}这是一个示例用法:foreach(vargroupingindata.GroupWithKeyBreaks(x=>xA,x=>xB)){Console.WriteLine("Key:"+grouping.Key);foreach(分组中的var元素){控制台。写入(元素);}}变种组计数器=0;诠释?prevA=空;集合.Select(item=>{vargroupId=item.A==prevA?groupCounter:++groupCounter;prevA=item.A;returnnew{groupId,item.A,item.B};}).GroupBy(item=>item.groupId).Select(grp=>new{A=grp.First().A,Bs=grp.Select(g=>gB)});如果你的集合在o中,那么:vartrans=o.Aggregate(new{List=newList>>(),LastSeed=(int?)0},(acc,item)=>{if(acc.LastSeed==null||item.A!=acc.LastSeed)acc.List.Add(Tuple.Create(item.A,newList()));acc.List[acc.List.Count-1].Item2.添加(item.B);返回新的{List=acc.List,LastSeed=(int?)item.A};},acc=>acc.List.Select(z=>new{A=z.Item1,B=z.Item2作为IEnumerable}));这会生成所需的表单的IEnumerable>varresult=list.ToKeyValuePairs(x=>xA).Select(x=>new{A=x.Key,Bs=x.Value.Select(y=>yB)});foreach(variteminresult){Console.WriteLine("A={0}Bs=[{1}]",item.A,String.Join(",",item.Bs));}–publicstaticclassMyExtensions{publicstaticIEnumerable>>ToKeyValuePairs(thisIEnumerablelist,FunckeySelector){ListretList=newList();Sprev=keySelector(list.FirstOrDefault());foreach(Titeminlist){if(keySelector(item).Equals(prev))retList.Add(item);else{yieldreturnnewKeyValuePair>(prev,retList);prev=keySelector(item);retList=新列表();retList.Add(项目);}}if(retList.Count>0)yieldreturnnewKeyValuePair>(prev,retList);}}OUTPUT:以上就是C#学习教程:转换集合分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——A=1Bs=[1,2]A=2Bs=[3,4]A=1Bs=[5]A=3Bs=[6]本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
