【问题标题】:BinarySearch array of objects by ID按 ID 的 BinarySearch 对象数组
【发布时间】:2015-01-03 08:28:16
【问题描述】:

美好的一天!

我有一个 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 对列表进行排序。像这样?:

tempValues.Sort(new ValueComparer());

以及如何使用 BinarySearch?

【问题讨论】:

    标签: c# .net list compare binary-search


    【解决方案1】:

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

        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>());
    

    【讨论】:

      【解决方案2】:

      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()); 
      

      您可以对列表执行更多操作。请参阅文档here。

      【讨论】:

      • @HamidP 你说得对,感谢您指出这一点。出于某种原因,我认为该方法会为您做到这一点。答案已更新。
      • 您在 idToFind 上进行搜索。 Wich 是一个整数。但是 BinarySearch 方法需要一个 ValueObj 作为第一个参数。
      【解决方案3】:

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

      return x.ID > y.ID;
      

      【讨论】:

      • 该 return 语句返回一个 bool 而不是 int。
      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 2022-01-18
      相关资源
      最近更新 更多