BinarySearch按ID排列的对象数组
本文关键字:对象 数组 排列 ID BinarySearch | 更新日期: 2023-09-27 18:29:22
您好!
我有一个ValueObj:的列表
class ValueObj
{
int ID;
float value;
}
如何通过id获取二进制搜索对象?(列出临时值)
我制作了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对列表进行排序。像这样吗?:
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
在执行二进制serach之前,您应该始终对列表进行排序
//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;