只要使用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>
,并比较基于name属性。
如果你不想要任何临时对象 - 我认为一个常量字符串是好的,否则你会丢失 - 然后你可以使用。
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);
}
第一个是没有binarysearch。第二个创建一个临时对象来找到我不想创建的东西,正如我在问题中所说的那样。 – codymanix 2010-03-21 22:21:12
对不起。我误解了你的问题,因为不想创建一个临时数组。我认为你对不创建临时对象的限制是错误的,因为它使解决方案变得更容易。否则,您需要创建一个更复杂的比较器,它可以将MyClass对象与字符串进行比较。 – tvanfosson 2010-03-21 22:29:17
@codymanix - note我用一个字符串/ MyClass比较器更新了我的答案,我认为它符合您的要求 - 除了它使用临时字符串对象。 :-) – tvanfosson 2010-03-21 22:44:25