繁体   English   中英

BinarySearch ID对象数组

[英]BinarySearch array of objects by ID

美好的一天!

我有一个ValueObj列表:

class ValueObj
{
   int ID;
   float value;
}

如何通过id获取二进制搜索对象? (列出tempValues)

我创建ValueComparer类,但不知道我是对的吗?

class ValueComparer<ValueObj>
{
   public int Compare(ValueObjx, ValueObjy)
   {
       if (x == y) return 0;
       if (x == null) return -1;
       if (y == null) return 1;

       return -1; ///???
   }
}

我需要按ID排序List。 像那样?:

tempValues.Sort(new ValueComparer());

以及如何使用BinarySearch?

首先,你应该让你的班级像这样。 您的字段不公开,您无法访问它们,公共字段也不好,所以您应该将它们更改为属性

    class ValueObj
    {      
        public int ID { get; set; }
        public float value { get; set; };
    }

和你的比较者一样

class ValueComparer : IComparable<ValueObj>
{
  public int Compare(ValueObj x, ValueObj y)
  {
      if (ReferenceEquals(x, y)) return 0;
      if (x == null) return -1;
      if (y == null) return 1;

      return x.ID == y.ID ? 0 :
               x.ID > y.ID ? 1 : -1;
  }
}

然后你有一个像这样的清单

var tempValues = new List<ValueObj>();
//many items are added here

在执行二进制搜索之前,您应该始终对列表进行排序

 //this does not modify the tempValues and generate a new sorted list
 var sortedList = tempValues.OrderBy(x => x.ID).ToList();

或者你可以直接对tempValues进行排序

//tempValues is modified in this method and order of items get changed
tempValues.Sort(new ValueComparer<ValueObj>());

现在您要查找特定ValueObj索引

var index = sortedList.BinarySearch(specificValueObj, new ValueComparer<ValueObj>());

或者如果您使用过第二种排序方法

var index = tempValues.BinarySearch(specificValueObj, new ValueComparer<ValueObj>());

C#中的List类有一个BinarySearch方法,可以与Comparable一起使用。

你的类型:

class ValueObj
{
    public int ID{ get; set;}
    public float value { get; set;}
}

您的比较类(不要忘记实现正确的接口!):

class ValueObjIDComparer : IComparable<ValueObj>
 {

    public int Compare(ValueObj x, ValueObj y)
    {
        if (x == null) return -1;
        if (y == null) return 1;

        if (x.ID == y.ID) return 0;            

        return x.ID > y.ID ? 1 : -1;
    }
 }

执行二进制搜索:

List<ValueObj> myList = new List<ValueObj>();
myList.Add(new ValueObj(){ID=1});
myList.Add(new ValueObj(){ID=2});
// ...

int idToFind = 2;
myList.Sort(new ValueObjIDComparer());
int indexOfItem = myList.BinarySearch(idToFind, new ValueObjIDComparer()); 

您可以在列表上执行更多操作。 请参阅此处的文档。

如果要按ID排序,只需比较Compare方法中的ID:

return x.ID > y.ID;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM