.net 只对数组的奇数元素排序

rkttyhzu  于 2023-05-19  发布在  .NET
关注(0)|答案(1)|浏览(131)

我想只对数组中的奇数元素进行排序,而不对偶数元素进行排序。
我使用LINQ查询创建了下面的代码,但在这一行得到一个错误:

.Select(x => x.value % 2 == 1 ? x.value : dictionary[x.index])

该错误是由于字典中没有键为“2”的项。即,当if语句的准则为假时,正在评估if语句中的字典[x.index]项(即,当x.值为偶数时)。

public class Kata
{
    public static int[] SortArray(int[] array)
    {
        var dictionary = array
                            .Select((value, index) => new { value, index })
                            .Where(x => x.value % 2 == 1)
                            .OrderBy(x => x.value)
                            .ToDictionary(x => x.index, x => x.value);

        var output = array
                            .Select((value, index) => new { value, index })
                            .Select(x => x.value % 2 == 1 ? x.value : dictionary[x.index])
                            .ToArray();

        return new int[1];
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Kata.SortArray(new int[] { 5, 3, 2, 8, 1, 4 }));
    }
}
omqzjyyz

omqzjyyz1#

您可以提取奇数项,对它们进行排序,最后将它们放回:

int[] array = new int[] { 5, 3, 2, 8, 1, 4};

// odd items extracted and sorted
using var odd = array
  .Where(item => item % 2 != 0)
  .OrderBy(item => item)
  .GetEnumerator();

for (int i = 0; i < array.Length; ++i) 
  if (array[i] % 2 != 0 && odd.MoveNext()) 
    array[i] = odd.Current;

Fiddle
请注意,检查奇数应该是item % 2 != 0,而不是item % 2 == 1,因为余数%在负item上返回-1

相关问题