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

将List转换为NumberRangeString分享

时间:2023-04-10 12:47:53 C#

ConvertingaListtoNumberRangeString这道题几乎和这道题相反:DoesC#havebuilt-insupportforparsingpagenumberstrings?所以给出1,3,5,6,7,8,9,10,12:我会输出:1,3,5-10,12这是我的第一次尝试。它看起来有点老套,可能是我写过的最糟糕的代码。你能建议一个改进的方法吗?有没有更好的办法?静态字符串numListToRangeStr(ListnumList){StringBuilderretString=newStringBuilder();numList.Sort();boolinRangeFind=false;intfirstInRange=numList[0];intlastNumber=firstInRange;布尔首先=真;for(inti=1;iPrettyRange(r)).Intersperse(","));}//////例如1,3,5,6,7,8,9,10,12///变成///(1,1),(3,3),(5,10),(12,12)///publicstaticIEnumerable>numListToPossiblyDegenerateRanges(IEnumerablenumList){TuplecurrentRange=null;foreach(varnuminnumList){if(currentRange==null){currentRange=Tuple.Create(num,num);}elseif(currentRange.Item2==num-1){currentRange=Tuple.Create(currentRange.Item1,num);}else{yieldreturncurrentRange;currentRange=Tuple.Create(num,num);}}if(currentRange!=null){yieldreturncurrentRange;}}//////例如(1,1)变为“1”///(1,3)变为“1-3”/////////publicstaticstringPrettyRange(元组范围){if(range.Item1==range.Item2){返回范围.Item1.ToString();}returnstring.Format("{0}-{1}",range.Item1,range.Item2);}publicstaticstringIntersperse(thisIEnumerableitems,stringinterspersand){varcurrentInterspersand="";varresult=newStringBuilder();foreach(variteminitems){result.Append(currentInterspersand);结果。追加(项目);当前Interspersand=interspersand;}返回结果.ToString();这是一个旧线程,但这是我内置到扩展方法中的新答案。这将返回一个范围数组,其中每个“范围”是一个数字('13')或一对数字('5-12'):publicstaticclassEnumExt{publicstaticstring[]ToRanges(thisListints){if(ints.Count();vartonums=newList();for(vari=0;iints[i]+1){tonums.Add(ints[i]);fromnums.Add(ints[i+1]);}}tonums.Add(ints[lng-1]);返回Enumerable.Range(0,tonums.Count).Select(i=>fromnums[i].ToString()+(tonums[i]==fromnums[i]?"":"-"+tonums[i].ToString())).ToArray();}}如果你想连接它们,只需要使用内置的string.Join:varintlist=newList(){1,2,3,6,7,8,9,10,14};Console.WriteLine(string.Join(",",intlist.ToRanges()));//打印:1-3,6-10,14不得不解决同样的问题。找到了我的解决方案的替代方案,我认为这看起来更合乎逻辑。所以分享它。如果你想对未排序的列表进行排序,请将第二个参数设置为true.public字符串ToRangeString(Listlist,boolwithSort){list=list.Distinct().ToList();if(withSort)list.Sort();StringBuilder结果=newStringBuilder();内部温度;0;i这应该可以正常工作,但尚未针对所有情况进行测试。字符串s="1,2,3,4,5,7,8,9,10,11,12,13";string[]ints=s.Split(',');StringBuilder结果=newStringBuilder();intnum,last=-1;布尔破折号=假;对于(intii=0;ii1){if(dash){result.Append(last);破折号=假;}if(result.Length>0){result.Append(",");}result.Append(num);}else{if(dash==false){result.Append("-");破折号=真;}}最后=num;if(dash&&ii==ints.Length-1){result.Append(num);}}Console.WriteLine(结果);这是RedFilter的略微修改版本。它返回一个字符串而不是一个字符串数组,如果在列表中,它会删除0,如果列表中只有一个值,它会避免异常。publicstaticstringToRanges(thisListints){ints.Remove(0);//注意:如果你想包含值0,请删除它if(ints.Count();vartonums=newList();for(vari=0;iints[i]+1){tonums.Add(整数[i]);fromnums.Add(ints[i+1]);}}tonums.Add(ints[lng-1]);string[]ranges=Enumerable.Range(0,tonums.Count).Select(i=>fromnums[i].ToString()+(tonums[i]==fromnums[i]?"":"-"+tonums[i].ToString())).ToArray();如果(范围。Length==1)returnranges[0];elsereturnString.Join(",",ranges);}我知道这是一个老线程,但我想我会分享我的方法。这会产生一个范围列表,可以很容易转换为单个字符串。以上就是C#学习教程的全部内容:列表转数字范围字符串。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varnumbers=newList(){1,3,5,6,7,8,9,10,12};变种范围=新列表();if(numbers.Count==0)返回范围;数字=数字。清楚的()。列表();数字.Sort();int开始=数字[0];字符串范围=start.ToString();for(inti=1;i本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: