我有一个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的随机访问. …
我在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) 我有一个实现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的其他属性以不同的方式对我的集合进行排序,以便让用户以多种不同的方式对我的集合进行排序?
任何人都可以建议在实现.NET中的IComparable之类的东西时,.NET使用什么排序算法来实际排序底层数据?也可以使用可自定义或可选择的算法?
当我想约束类型T可比时,我应该使用:
where T : IComparable
Run Code Online (Sandbox Code Playgroud)
要么
where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
如果#2有道理,我无法理解.任何人都可以解释它的区别是什么?
我正在尝试创建一个简单的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) 我正在实施IComparable并IComprable<T>在我的一个课程中.CompareTo在给定null参数时,是否有关于每种情况下该方法应如何表现的建议?它应该返回正数还是抛出ArgumentNullException?或者这种行为可能因实施类而异?
我正在为特定值清理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,但作为一个新手,我真的不知道如何前进.
任何想法,建议或例子都非常感谢.谢谢.
例如,当第二个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) 我在这里问一个特定的话题 - 我在网上找到了很少有关于此的信息.我正在实现一个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)