我对array.sort有点困难。我有一个类,这个类有两个字段,一个是随机字符串,另一个是随机数。如果我想用一个参数对它进行排序,它就可以了。但我想用两个参数对它进行排序。第一个是数字的和(从低到高),然后是这些数字等于给它们的随机字符串(从低到高)。
你能给我一些提示和提示我怎样才能“合并”这两种排序?
Array.Sort(Phonebook, delegate(PBook user1, PBook user2)
{ return user1.Sum().CompareTo(user2.Sum()); });
Console.WriteLine("ORDER");
foreach (PBook user in Phonebook)
{
Console.WriteLine(user.name);
}
这就是我用一个参数订购的方式。
答案 0 :(得分:10)
我认为这就是你所追求的目标:
sourcearray.OrderBy(a=> a.sum).ThenBy(a => a.random)
答案 1 :(得分:1)
以下是您将用于比较CompareTo
方法中的多个字段的常规算法:
public int compare(MyClass first, MyClass second)
{
int firstComparison = first.FirstValue.CompareTo(second.SecondValue);
if (firstComparison != 0)
{
return firstComparison;
}
else
{
return first.SecondValue.CompareTo(second.SecondValue);
}
}
但是,LINQ确实使这样做的语法更容易,只允许你写:
Phonebook = Phonebook.OrderBy(book=> book.Sum())
.ThenBy(book => book.OtherProperty)
.ToArray();
答案 2 :(得分:1)
您可以使用自定义IComparer<PBook>
就地执行此操作。以下应按照您的原始代码对您的数组进行排序,但如果两个总和相等,则应该返回随机字符串(我称之为RandomString
):
public class PBookComparer : IComparer<PBook>
{
public int Compare(PBook x, PBook y)
{
// Sort null items to the top; you can drop this
// if you don't care about null items.
if (x == null)
return y == null ? 0 : -1;
else if (y == null)
return 1;
// Comparison of sums.
var sumCompare = x.Sum().CompareTo(y.Sum());
if (sumCompare != 0)
return sumCompare;
// Sums are the same; return comparison of strings
return String.Compare(x.RandomString, y.RandomString);
}
}
您将此称为
Array.Sort(Phonebook, new PBookComparer());
你可以直接执行此操作,但有点难以理解:
Array.Sort(Phonebook, (x, y) => {
int sc = x.Sum().CompareTo(y.Sum());
return sc != 0 ? sc : string.Compare(x.RandomString, y.RandomString); });
......实际上,这并不算太糟糕,虽然我已经放弃了null
次检查。