C# - ToList() 和 ToArray() 的奇怪行为

标签 c# linq

在 C# 中组合使用 ToList() 和 ToArray() 时,我注意到一些奇怪的行为(使用 .NET 4.5.2 famework)。

给定以下测试程序:

int[] array = { 5, 1, -10, 667, 4 };
SorteerBib<int>.SelectionSort(array, Comparer<int>.Default);
Console.Out.WriteLine("Result - WRONG!");
for (int i = 0; i < array.Length; i++)
{
    Console.Out.Write(array[i] + " ");
    Console.Out.WriteLine();
}
Console.ReadKey();

SorteerBib 类由 2 个方法组成:

class SorteerBib<T>
{
    public static IList<T> SelectionSort(IList<T> list, IComparer<T> comparer)
    {
        for (int i = 0; i < list.Count - 1; i++)
        {
            int minIndex = i;
            for (int j = i + 1; j < list.Count; j++)
            {
                if (comparer.Compare(list[j], list[minIndex]) < 0)
                {
                    minIndex = j;
                }
            }
            T temp = list[i];
            list[i] = list[minIndex];
            list[minIndex] = temp;
        }

        Console.Out.WriteLine("Result SelectionSort IList - OK");
        for (int i = 0; i < list.Count; i++)
        {
            Console.Out.Write(list[i]+" ");
            Console.Out.WriteLine();
        }
        return list;
    }

    public static void SelectionSort(T[] array, IComparer<T> comparer)
    {
        // DOES NOT WORK, WHY?
        array = ((SelectionSort(array.ToList(), comparer)).ToArray());

        Console.Out.WriteLine("Result SelectionSort Array - OK");
        for (int i = 0; i < array.Length; i++)
        {
            Console.Out.Write(array[i] + " ");
            Console.Out.WriteLine();
        }
    }
}

错误在第二种方法的第一行:

array = ((SelectionSort(array.ToList(), comparer)).ToArray());

在 void 方法中,数组在此行之后排序,但是一旦我们返回主程序,排序就消失了。

将此行替换为以下行可以解决此问题:

IList<T> temp = SelectionSort(array.ToList<T>(), comparer);
for (int i = 0; i < array.Length; i++) {
    array[i] = temp[i];
}

谁能解释这种不可预测的行为? 非常感谢!

最佳答案

您正在传递没有 ref 的数组关键字,然后通过执行以下操作更改它的引用:

array = ((SelectionSort(array.ToList(), comparer)).ToArray());

ref未使用关键字,更改仅适用于函数。

解决方法是添加 ref关键词:

public static void SelectionSort(ref T[] array, IComparer<T> comparer)

顺便说一句,更好的方法是对 ICollection<T> 进行排序或 IEnumerable<T>相反。

关于C# - ToList() 和 ToArray() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40176175/

相关文章:

c# - LINQ如何动态使用多个ThenBy?

c# - 无法使用 jquery ajax 调用 aspx 页面 Web 方法

c# - 我如何将 List<Dictionary<string, object>> 转换为 List<[具有动态属性的新类]>

c# - 使用 Linq 展平/合并列表

c# - 如何让Automapper在非外键的Id字段上通过inner join抓取相关记录?

c# - SQL数据库中某个字段值发生变化时如何调用方法?

c# - XmlReader/Writer 给出结束元素的错误

c# - ServiceStack 日志记录设置

c# - 将嵌套的 for 循环转换为单个 LINQ 语句

c# - LINQ 中的 GroupBy 是如何工作的?