我有一个对象数组,我想通过二进制搜索来搜索日期/日期属性(用户决定)。
**编辑:我从文本文件中读取SharesArray [mid] .Date值(和日期值),示例为:05/02/2015,2014年8月14日.searchString值将从用户,但格式与日期值相同。 **
这是我的第一次尝试,所以我只是尝试日期属性:
int high, low, mid;
high = SharesArray.Length - 1;
low = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (String.Compare(SharesArray[mid].Date, searchString, true) == 0)
{
break;
}
else if (String.Compare(SharesArray[mid].Date, searchString, true) > 0)
{
high = mid - 1;
}
else if (String.Compare(SharesArray[mid].Date, searchString, true) < 0)
{
low = mid + 1;
}
我还尝试了最后的if if语句,但没有任何区别。
此外,String.Compare部分中string1和string2的循环方式是否重要?
答案 0 :(得分:1)
在问题的评论中总结问答的答案,并附上一些额外的背景。
对于二元搜索,您需要处理一些成分
compare(lhs, rhs)
返回:< 0
lhs < rhs
,> 0
lhs > rhs
和0
} if lhs == rhs
。compare
函数中参数的顺序很重要,如果你切换它们,你将采用错误的分支并改变上部搜索范围而不是更低,或者相反。lhs
:SharesArray[mid].Date
和rhs
= searchString
。DateTime.Compare
函数,并使用DateTime
将日期字符串转换为DateTime.ParseExact(myString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
个实例。使用字符串比较,您会得到错误的结果,例如"05/02/2015" < "14/10/2014"
。然后还有一个轶事评论(见here):
透视值mid
的计算容易出现整数溢出。如果你把它计算为
mid = (low + high) / 2;
然后low + high
可能变得大于整数。
因此,计算mid
的首选方式是
`mid = low + ((high - low) >> 1);`.
答案 1 :(得分:0)
你考虑过LINQ吗?
var searchIndex = SharesArray
.Select(s => s.Date)
.ToList()
.BinarySearch(searchString);