C# 带字符串的二进制搜索
我有一个对象数组,我想使用二进制搜索来搜索date/day属性(用户决定) **编辑:我从文本文件中读取SharesArray[mid]。日期值(和日期值),示例为:2015年2月5日、2014年10月14日。搜索字符串值将从用户处获得,但格式与日期值相同** 这是我第一次尝试,所以我只是尝试date属性:C# 带字符串的二进制搜索,c#,binary-search,C#,Binary Search,我有一个对象数组,我想使用二进制搜索来搜索date/day属性(用户决定) **编辑:我从文本文件中读取SharesArray[mid]。日期值(和日期值),示例为:2015年2月5日、2014年10月14日。搜索字符串值将从用户处获得,但格式与日期值相同** 这是我第一次尝试,所以我只是尝试date属性: int high, low, mid; high = SharesArray.Length - 1; low = 0; while (low <= high) { mid =
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;
}
int高、低、中;
高=共享阵列。长度-1;
低=0;
while(低0)
{
高=中-1;
}
else if(String.Compare(SharesArray[mid].Date,searchString,true)<0)
{
低=中+1;
}
我也尝试了最后一个else-if语句作为just-else,这没有任何区别
另外,字符串1和字符串2在字符串中的位置是否重要。比较部分?您考虑过LINQ吗
var searchIndex = SharesArray
.Select(s => s.Date)
.ToList()
.BinarySearch(searchString);
在问题的评论中总结问答中的答案,并添加一些额外的上下文 对于二进制搜索,有一些成分需要注意
compare(lhs,rhs)
返回:<0
如果lhs
,>0
如果lhs>rhs
和0
如果lhs==rhs
compare
函数中参数的顺序很重要,如果您切换它们,您将使用错误的分支并更改搜索上限而不是下限,或者相反lhs
:SharesArray[mid].Date
和rhs
=searchString
DateTime.Compare
函数,并使用DateTime.ParseExact(myString,“dd/MM/yyyy”,CultureInfo.InvariantCulture)将日期字符串转换为DateTime
实例代码>。通过字符串比较,您将得到错误的结果,例如“05/02/2015”<“14/10/2014”
mid
的计算容易出现整数溢出。如果你把它算作
mid = (low + high) / 2;
然后low+high
可能会变得大于整数中的拟合值
因此,计算mid
的首选方法是
`mid = low + ((high - low) >> 1);`.
字符串中字符串的顺序。比较是不相关的。请告诉我们
SharesArray
中如何定义Date
,并举例说明searchString
可以是什么值,以及SharesArray[mid]可能是什么值.Date
可能是吗?我也这么认为,但当我使用断点并观察控制流时,当我交换它们时,它会转移到数组中的不同元素。我已经为您进行了编辑John@SteveCompare
调用中的顺序绝对不是无关的,mid
计算是正确的,虽然它可能容易受到溢出的攻击,所以mid=low+((high-low)>>1)
会更好我尽量不使用内置的BinarySearchmethod@EmmaD问题中应该提到你想要实现的任何目标。@EmmaD因为Alex在评论中的回答可能对你有用,为了子孙后代的利益,值得接受这个总结作为答案。