Просто используйте 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 );
}