4

我对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);
        }

这就是我用一个参数订购它的方式。

4

3 回答 3

12

我认为这就是你所追求的:

sourcearray.OrderBy(a=> a.sum).ThenBy(a => a.random)
于 2012-11-20T16:28:34.073 回答
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();
于 2012-11-20T16:35:39.720 回答
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支票。

于 2012-11-20T16:36:48.923 回答