16,553
社区成员
发帖
与我相关
我的任务
分享
string txt = "69,79-88,89-95,96-102,103,104,131-134,135-149,150-153,190,242-243";
var tmp = txt.Split(',').Select(str => str.Split('-').Select(s => int.Parse(s)).ToArray()).ToArray();
Func<int[], int> func = ta =>
{
return ta.Length > 1 ? ta[1] : ta[0];
};
int? sNum = null;
int? eNum =null;
List<string> result = new List<string>();
Action act = () =>
{
if (sNum != eNum)
{
result.Add(string.Format("{0}-{1}", sNum, eNum));
}
else
{
result.Add(sNum.ToString());
}
};
for (var i = 0; i < tmp.Length; i++)
{
var arr = tmp[i];
if (sNum.HasValue)
{
if (eNum + 1 == arr[0])
{
eNum = func(arr);
continue;
}
else
{
act();
}
}
sNum = arr[0];
eNum = func(arr);
}
act();
Console.WriteLine(string.Join(",", result));
void Main()
{
string str="69-78,79-88,89-95,96-102,103,104,131-134,135-149,150-153,190,242-243";
string[] array= str.Split(',');
if(!array.Any()) return;
string result = array.First().Split('-')[0] + "-";
array.Aggregate((x,y)=>{
string s = CheckItem(x,y);
if(s.Contains("error"))
{
if(!x.Contains("-"))
{
if(result.Split(',').LastOrDefault() != x + "-")
{
result = result+ x + ",";
result = result+ y.Split('-')[0] + "-";
}
else
{
result = result.TrimEnd('-')+ ",";
result = result+ y.Split('-')[0] + "-";
}
}
else
{
result = result+ x.Split('-')[1] + ",";
result = result+ y.Split('-')[0] + "-";
}
}
return y;
});
result += array.Last().Split('-')[1];
Console.WriteLine(result); //69-104,131-153,190,242-243
}
string CheckItem(string x, string y)
{
string result = "";
if(x.Contains("-") && y.Contains("-"))
{
string[] firstItem = x.Split('-');
string[] lastItem = y.Split('-');
if(int.Parse(firstItem[1]) == int.Parse(lastItem[0])-1)
result = lastItem[1];
else result = "error-"+lastItem[1];
}
else if(!x.Contains("-") && y.Contains("-"))
{
string[] lastItem = y.Split('-');
if(int.Parse(x) == int.Parse(lastItem[0])-1)
result = lastItem[1];
else result = "error-"+lastItem[1];
}
else if(x.Contains("-") && !y.Contains("-"))
{
string[] firstItem = x.Split('-');
if(int.Parse(firstItem[1]) == int.Parse(y)-1)
result = y;
else result = "error-"+ y;
}
else
{
if(int.Parse(x) == int.Parse(y) -1) result = y;
else result = "error-"+ y;
}
return result;
}
public class Item
{
public int Num;
public bool 判断是否能合并(Item a, Item2)
{
//.....
}
}
public class Item2: Item
{
public int Num2;
}
你再来写“判断.....”的算法,以至于List<Item> 顺序地用相邻的两个元素替换的算法。这个你完全可以自己设计,前提是要写出一个真正的自定义的数据结构。