【问题标题】:C# dividing an integer array using pointerC#使用指针划分整数数组
【发布时间】:2013-02-17 20:14:27
【问题描述】:

所以我有一个快速排序算法,我必须将我的整数数组一分为二,然后递归调用这两个数组。

partition(array,lower);
partition(&array[lower + 1], array.Length - lower - 1);

但即使我尝试将不安全的代码添加到分区类,c# 也不会接受该代码,所以我想知道必须做什么才能使其工作?

也许我可以在不使用指针的情况下修复它,但我想学习,所以每次遇到这样的问题时,我都不必为它更改整个代码。

【问题讨论】:

  • “c# won't accept that code”... 是不是说“I won't accept the code”?也许相反,它说的信息更丰富?
  • 您不需要指针和不安全的代码。你可以通过稍微改变你的方法来做同样的事情partition(array,0,lower);partition(array,lower + 1, array.Length - lower - 1); 形成子数组或 Linq 等其他替代方法可能会损害性能。

标签: c# arrays pointers integer


【解决方案1】:

要使用不安全的代码,你需要两件事:

  1. unsafe keyword 标记不安全的代码(正如你所说的那样)
  2. 通过配置appropriate setting 将项目编译为不安全

【讨论】:

    【解决方案2】:

    linq 怎么样?

    array.Take(lower);
    array.Skip(lower);
    

    You'll love it

    【讨论】:

    • 它有助于忘记c#中的指针,只需复制数据或制作迭代器;即 IEnumerable 的
    • 但这就像用大炮杀死苍蝇:P
    • 并非如此,首先您编写的代码更少(总是好的)。其次,你使用了完美的迭代器的功能,为什么要重新实现呢?第三,迭代器不复制数据,它描述了应该如何遍历数据源;所以你已经优化了内存分配。
    【解决方案3】:

    Array 创建SubArray 的简单方法

        private static void Main()
        {
    
            int[] array = Enumerable.Range(1, 10).ToArray();
            int lower = 5;
            int[] array1 = array.SubArray(0, lower);
            int[] array2 = array.SubArray(lower, array.Length - lower);
        }
    
        public static T[] SubArray<T>(this T[] source, int sourceIndex, int length)
        {
            T[] result = new T[length];
            Array.Copy(source, sourceIndex, result, 0, length);
            return result;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      相关资源
      最近更新 更多