C# 带字符串的二进制搜索

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 =

我有一个对象数组,我想使用二进制搜索来搜索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 = (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@Steve
    Compare
    调用中的顺序绝对不是无关的,
    mid
    计算是正确的,虽然它可能容易受到溢出的攻击,所以
    mid=low+((high-low)>>1)
    会更好我尽量不使用内置的BinarySearchmethod@EmmaD问题中应该提到你想要实现的任何目标。@EmmaD因为Alex在评论中的回答可能对你有用,为了子孙后代的利益,值得接受这个总结作为答案。