我有一个特定类型的数组。现在我想找到满足某个条件的条目。
使用我不想创建临时对象的限制来执行此操作的首选方法是什么,但我只想提供搜索条件。
MyClass[] myArray;
// fill and sort array..
MyClass item = Array.BinarySearch(myArray, x=>x.Name=="Joe"); // is this possible?
也许可以使用LINQ解决它?
编辑: 我知道它适用于普通集合,但我需要它才能用于BinarySearch。
答案 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");