标签: icomparable

维护排序顺序C#的集合

我有一个Foo包含对象列表的类:List<Bar>.每个Bar属性都有一个属性,可以对它们进行排序(类型TimeSpan,表示持续时间),并且Bar是一个不可变对象 - 也就是说,持续时间不会随着算法的运行而改变.目前,对于每一个Foo我也保持Bar在列表中的第一个如果它被订购(即Bar最短的持续时间).像这样的东西:

public class Foo
{
    public List<Bar> AllBars { get; set; }

    public Bar FirstBar { get; set; }

    public Foo (Bar bar)
    {
        FirstBar = bar;

        AllBars = new List<Bar>() { bar };
    }

    public AddBar(Bar bar)
    {
        if(bar.Duration < FirstBar.Duration)
        {
            FirstBar = bar;
        }

        AllBars.Add(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

此类Foo用于处理性能(速度)至关重要的算法中.记忆很重要但不如速度快.有一个n Foo s 列表,每个都有m Bar s.直到这一刻,这门课一直很好.我现在希望为用户提供多种选择,这意味着我需要提供Bar对列表中前几个s的随机访问. …

.net c# sorting performance icomparable

12
推荐指数
2
解决办法
2905
查看次数

为什么C#Array.BinarySearch如此之快?

我在C#中实现了一个非常简单的 binarySearch实现,用于在整数数组中查找整数:

二进制搜索

static int binarySearch(int[] arr, int i)
{
    int low = 0, high = arr.Length - 1, mid;

    while (low <= high)
    {
        mid = (low + high) / 2;

        if (i < arr[mid])
            high = mid - 1;

        else if (i > arr[mid])
            low = mid + 1;

        else
            return mid;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

当比较它与C#的母语Array.BinarySearch(),我可以看到Array.BinarySearch()快两倍以上为我的功能,每一次.

Array.BinarySearch上的 MSDN :

使用由Array的每个元素和指定对象实现的IComparable通用接口,搜索特定元素的整个一维排序数组.

是什么让这种方法如此之快?

测试代码

using System;
using System.Diagnostics;

class Program
{
    static …
Run Code Online (Sandbox Code Playgroud)

c# performance search icomparable

12
推荐指数
1
解决办法
2990
查看次数

C# - 如何为IComparable <T>类实现多个比较器?

我有一个实现IComparable的类.

public class MyClass : IComparable<MyClass>
{
    public int CompareTo(MyClass c)
    {
        return this.whatever.CompareTo(c.whatever);
    }

    etc..
}
Run Code Online (Sandbox Code Playgroud)

然后我可以调用我的类的通用列表的排序方法

List<MyClass> c = new List<MyClass>();
//Add stuff, etc.

c.Sort();
Run Code Online (Sandbox Code Playgroud)

并根据我的比较器对列表进行排序.

我如何指定进一步的比较器根据MyClass的其他属性以不同的方式对我的集合进行排序,以便让用户以多种不同的方式对我的集合进行排序?

c# sorting compare icomparable

11
推荐指数
2
解决办法
8674
查看次数

.NET框架实现了什么排序算法

任何人都可以建议在实现.NET中的IComparable之类的东西时,.NET使用什么排序算法来实际排序底层数据?也可以使用可自定义或可选择的算法?

c# sorting collections icomparable

11
推荐指数
2
解决办法
9743
查看次数

IComparable的接口约束

当我想约束类型T可比时,我应该使用:

where T : IComparable
Run Code Online (Sandbox Code Playgroud)

要么

where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

如果#2有道理,我无法理解.任何人都可以解释它的区别是什么?

.net c# generics interface icomparable

10
推荐指数
3
解决办法
2028
查看次数

与IComparable一起使用的Nullable泛型类型.可能吗?

我正在尝试创建一个简单的Clamp(这样我就可以绑定任何类似的值...主要用于数字类型,如int,double等)

问题是如果我执行以下操作我得到一个错误,但根据MSDN IComparable的CompareTo应该能够处理空值.
Quote:"根据定义,任何对象都比较大于null,两个空引用比较相等."

public static T Clamp<T>(this T value, T min, T max)
    where T : IComparable<T>
{
    if (value.CompareTo(max) > 0)
        return max;

    if (value.CompareTo(min) < 0)
        return min;

    return value;
}



private Int32? _zip;
public Int32? Zip
{
    get
    {
        return _zip;
    }
    set
    {
        _zip = value.Clamp<Int32?>(0, 99999);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics nullable icomparable

10
推荐指数
2
解决办法
5831
查看次数

null参数的IComparable行为

我正在实施IComparableIComprable<T>在我的一个课程中.CompareTo在给定null参数时,是否有关于每种情况下该方法应如何表现的建议?它应该返回正数还是抛出ArgumentNullException?或者这种行为可能因实施类而异?

我看到了MSDN文档(这里这里),但它在这个主题上没什么可说的.任何帮助将不胜感激.

.net c# icomparable

10
推荐指数
3
解决办法
3832
查看次数

比较/计算System.Collections.ArrayList中的值

我正在为特定值清理5个文件.我不期待任何不同的价值观,但因为这是出于我自己的教育目的,我希望应用程序可以计算,比较和打印最受欢迎的价值.

例如:

ArrayList arrName = new ArrayList();
arrName.Add("BOB")
arrName.Add("JOHN")
arrName.Add("TOM")
arrName.Add("TOM")
arrName.Add("TOM")
Run Code Online (Sandbox Code Playgroud)

我想要的结果是TOM,但作为一个新手,我真的不知道如何前进.

任何想法,建议或例子都非常感谢.谢谢.

c# arraylist icomparable

9
推荐指数
1
解决办法
4107
查看次数

为什么Java的TreeSet没有指定其类型参数必须扩展Comparable?

例如,当第二个Object添加到TreeSet时,下面的代码抛出ClassCastException.无法编写TreeSet,因此type参数只能是Comparable类型? TreeSet不会编译,因为Object不是Comparable.通过这种方式,仿制药实际上可以完成它们的工作 - 类型安全.

import java.util.TreeSet;
public class TreeSetTest {
  public static void main(String [] args) {
   TreeSet<Object> t = new TreeSet<Object>();
   t.add(new Object());
   t.add(new Object());
  }
}
Run Code Online (Sandbox Code Playgroud)

java generics icomparable treeset

9
推荐指数
2
解决办法
2954
查看次数

在F#元组中使用CustomComparison和CustomEquality实现自定义比较

我在这里问一个特定的话题 - 我在网上找到了很少有关于此的信息.我正在实现一个F#版本的Minimax算法.我现在遇到的问题是我要比较我的树叶(下面的数据结构).搜索VS给我的错误,我得到了这样的东西:

我曾经拥有的树类型:

type TreeOfPosition =
    | LeafP   of Position
    | BranchP of Position * TreeOfPosition list
Run Code Online (Sandbox Code Playgroud)

和实施IComparable的流行

type staticValue = int
[<CustomEquality;CustomComparison>]
type TreeOfPosition =
    | LeafP   of Position * staticValue
    | BranchP of Position * TreeOfPosition list

    override x.Equals(yobj) = 
        match yobj with
        | :? TreeOfPosition as y -> (x = y)
        | _ -> false

    override x.GetHashCode() = hash (x)
    interface System.IComparable with
        member x.CompareTo yobj =
            match yobj with
            | :? TreeOfPosition as y -> …
Run Code Online (Sandbox Code Playgroud)

f# equals icomparable compareto minimax

9
推荐指数
1
解决办法
2436
查看次数