ReIndex Number List但在C#中保留重复#

时间:2018-04-04 20:14:46

标签: c# linq

我正在尝试重新排序基本上摆脱重复的列表。我能做到的。绊倒我的部分是,如果有重复,我想保留它们,并保持秩序

示例 -

输入= 1,3,3,4 输出= 1,2,2,3

输入= 1,3,5,6,6 输出= 1,2,3,4,4

任何帮助都将不胜感激。

编辑 -

我尝试过的代码。

for (int i = 1; i <= numList.Count; i++)
{
    if (numList[i - 1] == numList[i])
    {
        foreach (var item in numList.Where(x => x == numList[i - 1]))
        {
            testList.Add(item);
            i++;
        }
        foreach (var item in testList)
        {
            numList.Add(item);
        }

    }
    else
    {
        numList[i - 1] = i;
    }
}

4 个答案:

答案 0 :(得分:1)

这样的东西?请注意,我们不确定输入是否会出现故障。如果我们允许更改输入数组,Array.Sort(values)顶部的简单Rebase将确保该方面。

static void Main(string[] args)
{
    Console.WriteLine(string.Join(", ", Rebase(1, 3, 3, 4))); // 1, 2, 2, 3
    Console.WriteLine(string.Join(", ", Rebase(1, 3, 5, 6, 6))); // 1, 2, 3, 4, 4
}
static int[] Rebase(params int[] values)
{
    // Array.Sort(values); // if not already sorted, and allowed to mutate
    int prev = values[0];
    var result = new int[values.Length];
    int val = result[0] = 1;
    for (int i = 1; i < values.Length; i++)
    {
        var current = values[i];
        if (current != prev)
        {
            val++;
            prev = current;
        }
        result[i] = val;
    }
    return result;
}

请注意,您 还可以选择覆盖输入数组,而不是创建要返回的新数组。

答案 1 :(得分:1)

你的问题与排序无关......但我想我明白你在寻找什么,以下代码应该提供它:

List<Int32> numbers = new List<Int32> { 1, 3, 3, 4 };
List<Int32> result = new List<Int32>(numbers.Count);

Int32 currentValue = 1;
Int32 lastNumber = numbers[0];

for (Int32 i = 0; i < numbers.Count; ++i)
{
    Int32 number = numbers[i];

    if (numbers[i] != lastNumber)
        ++currentValue;

    result.Add(currentValue);
    lastNumber = number;
}

foreach (Int32 number in result) 
    Console.WriteLine(number); // Output: 1, 2, 2, 3

请访问this link尝试一个可以实现以下功能的工作演示:

private static List<Int32> IndexNumbers(List<Int32> input)
{
    List<Int32> numbers = input.OrderBy(x => x).ToList();
    List<Int32> result = new List<Int32>(input.Count);

    Int32 currentValue = 1;
    Int32 lastNumber = numbers[0];

    for (Int32 i = 0; i < numbers.Count; ++i)
    {
        Int32 number = numbers[i];

        if (numbers[i] != lastNumber)
            ++currentValue;

        result.Add(currentValue);
        lastNumber = number;
    }

    return result;
}

答案 2 :(得分:1)

使用LINQ尝试此操作:

var reindexed = numList
    .OrderBy(n => n)
    .GroupBy(n => n)
    .SelectMany((g, i) => g
        .Select(e => i + 1));

答案 3 :(得分:1)

首先,找出旧号码应该匹配的内容。 DistinctOrderBy可能是您在这里的朋友

List<int> input = new List<int> { 1, 3, 3, 4 };

var dictionary = new Dictionary<int, int>();
var index = 1;
foreach (var n in input.Distinct().OrderBy(n => n)) {
    dictionary.Add(n, index++);
}

var output = input.Select(n => dictionary[n]);