Array.BinarySearch满足某个条件

时间:2010-03-21 22:10:59

标签: c# .net linq arrays comparison

我有一个特定类型的数组。现在我想找到满足某个条件的条目。

使用我不想创建临时对象的限制来执行此操作的首选方法是什么,但我只想提供搜索条件。

MyClass[] myArray;
// fill and sort array..
MyClass item = Array.BinarySearch(myArray, x=>x.Name=="Joe"); // is this possible?

也许可以使用LINQ解决它?

编辑: 我知道它适用于普通集合,但我需要它才能用于BinarySearch。

3 个答案:

答案 0 :(得分:3)

只需使用FirstOrDefault(或SingleOrDefault,如果唯一)。

 var myItem =  myArray.FirstOrDefault( x => x.Name == "Joe" );

或者,如果您想强制使用BinarySearch ,您就知道数组已排序

 var myItem = Array.BinarySearch( myArray,
                                  new MyClass { Name = "Joe" },
                                  new MyClassNameComparer() );

其中MyClassNameComparer为IComparer<MyClass>,并根据名称属性进行比较。

如果你不想要任何临时对象 - 我认为一个常量字符串是可以的,否则你就丢失了 - 那么你可以使用。

 var myItem = Array.BinarySearch( myArray,
                                  "Joe",
                                  MyClassOrStringComparer() );

MyClassOrStringComparer能够将字符串与MyClass对象进行比较(反之亦然)。

public class MyClassOrStringComparer
{
     public int Compare( object a, object b )
     {
         if (object.Equals(a,b))
         {
             return 0;
         }
         else if (a == null)
         {
             return -1;
         }
         else if (b == null)
         {
             return 1;
         }

         string aName = null;
         string bName = null;

         if (a is string)
         {
             aName = a;
         }
         else
         {
             aName = ((MyClass)a).Name;
         }

         if (b is string)
         {
             bName = b;
         }
         else
         {
             bName = ((MyClass)b).Name;
         }

         return aName.CompareTo( b.Name );
   }

答案 1 :(得分:1)

BinarySearch只能在数组排序时使用,并且只能在搜索排序键的特定值时使用。所以这排除了使用任意谓词。

答案 2 :(得分:0)

不,BinarySearch不包含Comparision&lt;&gt;的重载参数。您可以改用LINQ方法:

MyClass item = myArray.FirstOrDefault(x => x.Name == "Joe");