我有一个包含整数的数组
1,1,2,1,1,2,2,2,3,3,3,2,4,4,4,4
我希望能够替换那些不能完成序列重复次序的元素,所以从上面的例子中可能就像
1,1,1,1,1,2,2,2,3,3,3,3,4,4,4,4.
我曾尝试过使用一些丑陋的庞大功能,但我喜欢循环播放,但这一切都是静脉所以。
想知道是否有一种简洁的LINQ方式来实现它。
有什么建议吗?
答案 0 :(得分:1)
如果不是不可能只在LINQ中实现它将是困难的。如果你想要像你描述的那样具有功能性,你必须实现以下方法:
using System;
namespace LinqSequence
{
class Program
{
static void Main(string[] args)
{
var arr = new int[]
{
1,1,2,2,2,1,2,3,3,3,2,4,4,4,5,5,4,4
};
var newArr = SequenceReplace(arr);
Console.WriteLine(String.Join(", ",newArr));
//OUT: 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5
}
static int[] SequenceReplace(int[] arr)
{
int length = arr.Length;
var newArr = new int[length];
int previous = 0;
for (int i = 0; i < length; i++)
{
if (newArr[previous] > arr[i])
{
newArr[i] = newArr[previous];
}
else
{
newArr[i] = arr[i];
}
previous = i;
}
return newArr;
}
}
}
之前的程序不正确,因为它没有查看两个adjectant字段。因此,该程序在您的问题中不适用于测试用例。所以这是新的答案。它会查看两个adjectant字段,如果current不同于它,则它会替换当前左边的那个。它还处理边缘情况。如果长度小于2,则只返回该数组,如果长度为2则返回具有2个元素0&#39; s的数组。如果没有下一个元素,则将该元素替换为前一个元素。
using System;
namespace LinqSequence
{
class Program
{
static void Main(string[] args)
{
var arr1 = new int[]
{
1,1,2,1,1,2,2,2,3,3,3,2,4,4,4,4
};
var newArr1 = SequenceReplace(arr1);
Console.WriteLine(String.Join(",",newArr1));
//OUT: 1,1,1,1,1,2,2,2,3,3,3,3,4,4,4,4
var arr2 = new int[]
{
1,1,2,2,2,1,2,3,3,3,2,4,4,4,5,5,4,4
};
var newArr2 = SequenceReplace(arr2);
Console.WriteLine(String.Join(",",newArr2));
//OUT: 1,1,2,2,2,2,2,3,3,3,3,4,4,4,5,5,4,4
}
static int[] SequenceReplace(int[] arr)
{
int length = arr.Length;
if (length == 2) return new int[] { arr[0], arr[0] };
else if (length < 2) return arr;
var newArr = new int[length];
newArr[0] = arr[0];
int previous = 0, next = 2;
for (int i = 1; i < length; i++)
{
if ((next < length &&
newArr[previous] != arr[i] &&
arr[next] != arr[i]) ||
next >= length)
{
newArr[i] = newArr[previous];
}
else
{
newArr[i] = arr[i];
}
previous++;
next++;
}
return newArr;
}
}
}
此处ideone。
答案 1 :(得分:-1)
只需使用orderBy func,就像这样:
List<int> list = new List<int>() { //your data };
list = list.OrderBy(i=> i);
答案 2 :(得分:-1)
像这样使用sort和regex
static void Main(string[] args)
{
string input = "00H1,00H1,00H2,00H1,00H1,00H2,00H2,00H2,00H3,00H3,00H2,00H3";
List<string> array = input.Split(new char[] { ',' }).ToList();
array.Sort((x,y) => GetSuffix(x).CompareTo(GetSuffix(y)));
string output = string.Join(",",array);
}
static int GetSuffix(string input)
{
string pattern = "H(?'suffix'\\d*)";
Match match = Regex.Match(input, pattern);
return int.Parse(match.Groups["suffix"].Value);
}
这是Linq解决方案
static void Main(string[] args)
{
string input = "00H1,00H1,00H2,00H1,00H1,00H2,00H2,00H2,00H3,00H3,00H2,00H3";
List<string> array = input.Split(new char[] { ',' }).ToList();
array = array.Select(x => new
{
suffix = GetSuffix(x),
item = x
}).OrderBy(x => x.suffix).Select(x => x.item).ToList();
string output = string.Join(",",array);
}
static int GetSuffix(string input)
{
string pattern = "H(?'suffix'\\d*)";
Match match = Regex.Match(input, pattern);
return int.Parse(match.Groups["suffix"].Value);
}