替换顺序c#中的非常见元素

时间:2015-07-26 12:19:05

标签: c# linq replace sequence

我有一个包含整数的数组

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方式来实现它。

有什么建议吗?

3 个答案:

答案 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);
        }​