【问题标题】:Float sorting with Array.Sort()使用 Array.Sort() 进行浮点排序
【发布时间】:2012-08-17 20:45:20
【问题描述】:

我需要在 C# 中对float 中的某些对象中的一些距离进行排序。我使用委托和Array.Sort 对它们进行排序,但似乎我不能使用float

在转换为int 时如何保持这些浮点数的精度?

是否可以使用Array.Sortfloat 而不是int 作为回报?

不使用 LINQ。

【问题讨论】:

  • 如果没有精度损失,您无法将 float 转换为 int。显示为您的代码的一些示例。
  • 顺便说一句,虽然该问题的标题提到了 LINQ,但有许多正确答案确实使用了 Comparer 或 Comparison 而不是 LINQ,它们应该同样适合您。
  • 为什么不想使用 LINQ?
  • 我看到很多关于 LINQ 的帖子,但是我不能使用 LINQ。

标签: c# .net arrays sorting


【解决方案1】:

Array.Sort<T>(T[] array, Comparison<T> comparison) 不限于任何类型,只要您提供正确的比较委托。比较委托应该返回包含比较操作结果的整数值,而不是要与某物进行比较的值。例如,如果你有类 Xfloat 属性 Property,你可以像这样对它们进行排序:

public sealed class X
{
    public float Property { get; set; }
}

static void Test()
{
    var arr = new X[]
    {
        new X { Property = 5.5f },
        new X { Property = 2.5f },
        new X { Property = 6.5f },
        new X { Property = 1.2f },
    };
    Array.Sort(arr, (a, b) => a.Property.CompareTo(b.Property));
}

【讨论】:

    【解决方案2】:

    您可以使用 LINQ OrderBy 扩展方法

    var arr = new[] { 1.3f, 1.4f };
    arr.OrderBy( a => a ).ToArray();
    

    【讨论】:

    • 他后来添加了它。好的,对不起,一开始没有限制
    【解决方案3】:

    你可以使用 LINQ 吗?

    arrayOfFloats = arrayOfFloats.OrderBy(x => x);
    

    【讨论】:

      【解决方案4】:

      最好的变体是使用 radixsort,查看更多内容

      Is there a good radixsort-implementation for floats in C#

      祝你好运

      【讨论】:

        【解决方案5】:

        我猜您正在使用一些较旧的 .Net 版本,因为在您的一个 cmets 中您曾要求您不想使用 LINQ。

        在这种情况下可以使用Array.Sort

        float[] myfloatarray = new float[5];
        
        Array.Sort(myfloatarray);
        

        这将使用

        Array.Sort<T>(T[] array);
        

        这不使用任何仅限 LINQ 的泛型,并且在 .Net 2.0 中可用。

        Read about Array.Sort here

        【讨论】:

          【解决方案6】:

          也许您将“in”类型 T 与必须为 intComparison&lt;T&gt; 委托的返回类型混淆了?

          这很好用:

          float[] arr = { 2.3f, 1.1f, 9.0f, 6.6f, };
          Array.Sort(arr, (x, y) => SomeMethodReturningInt(x, y));
          

          在这种情况下,Sort 的第二个参数是 Comparison&lt;float&gt;。在 lambda 中,xyfloats。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多