2

次のクラスを使用して、リストをtypeメンバーで並べ替えています。

public class CameraSortByType : IComparer<Camera>
{
    private bool asc;

    public CameraSortByType(bool a)
    {
        this.asc = a;
    }

    public int Compare(Camera x, Camera y)
    {
        if (x.type > y.type)
            return asc? -1 : 1;
        if (x.type < y.type)
            return asc? 1 : -1;
        else
            return 0;
    }
}

同じリストを次のように並べ替えていますname

myList.Sort((s1, s2) => s2.name.CompareTo(s1.name)); 

名前による並べ替えをタイプ別の並べ替えクラスに組み込むにはどうすればよいですか?それで、タイプでソートすると、名前でもソートされますか?

更新:Linqバージョン

var primarySortResult = primarySort ? CameraStorage.CameraList.OrderBy(x => x.type) : CameraStorage.CameraList.OrderByDescending(x => x.type);
var secondarySortResult = secondarySort ? primarySortResult.ThenBy(x => x.name) : primarySortResult.ThenByDescending(x => x.name);
CameraStorage.CameraList = secondarySortResult.ToList();
4

3 に答える 3

1

LINQがオプションの場合、次の演算子を使用して順序付きシーケンスを作成できます。

サンプル:

var orderedList = myList.OrderBy(x => x.type)
                        .ThenByDescending(x => x.name)
                        .ToList();

いくつかの条件に基づいて注文する必要がある場合:

var result = ascendingByType ? myList.OrderBy(x => x.type) :
                               myList.OrderByDescending(x => x.type);

if (orderByNameRequired)
{
    result = ascendingByName ? result.ThenBy(x => x.name) :
                               result.ThenByDescending(x => x.name);
}

orderedList = result.ToList();

DynamicLinqの使用も検討してください。


また、2つのプロパティでソートするための比較器の実装もあります(ここではnullの処理も考慮してください)。

public class CameraComparer : IComparer<Camera>
{
    private SortDirection typeSortDirection;
    private SortDirection nameSortDirection;

    public CameraComparer(SortDirection typeSortDirection, 
                          SortDirection nameSortDirection)
    {
        this.typeSortDirection = typeSortDirection;
        this.nameSortDirection = nameSortDirection;
    }

    public int Compare(Camera x, Camera y)
    {
        if (x.Type == y.Type)
            return x.Name.CompareTo(y.Name) * 
           (nameSortDirection == SortDirection.Ascending ? 1 : -1);

        return x.Type.CompareTo(y.Type) * 
           (typeSortDirection == SortDirection.Ascending ? 1 : -1);
    }
}

public enum SortDirection
{
    Ascending,
    Descending
}

使用法:

myList.Sort(new CameraComparer(SortDirection.Ascending, SortDirection.Descending));
于 2013-03-19T12:08:57.297 に答える
1

私はこのような場合にTuplesを使用します:

public int Compare(Camera x, Camera y) {
    var xx = Tuple.Create(x.name, x.type);
    var yy = Tuple.Create(y.name, y.type);
    return xx.CompareTo(yy);
}

つまり、すべてのプロパティを同じ順序で比較したいとします。そうでない場合は、次のような操作を行うことで、プロパティ(例)が考慮される順序を逆にすることができると思います。name

var xx = Tuple.Create(y.name, x.type);
var yy = Tuple.Create(x.name, y.type);

つまり、「間違った」タプルに入れます。しかし、私はこの部分をまったくテストしていません。

于 2013-03-19T12:04:26.063 に答える
1
public int Compare(Camera x, Camera y)
{
    if (x.type > y.type)
        return asc ? -1 : 1;

    if (x.type < y.type)
        return asc ? 1 : -1;

    if (x.name.CompareTo(y.name) > 0)
        return asc ? -1 : 1;

    if (x.name.CompareTo(y.name) < 0)
        return asc ? 1 : -1;

    return 0;
}
于 2013-03-19T11:56:31.557 に答える