Как отсортировать список объектов определенным полем в C#?

Я предпочитаю WinMerge для diffs, таким образом, в контекстном меню в Проводнике [Средство просмотра TortoiseSVN\Settings\External Programs\Diff] я выбираю опцию External со значением:

C:\Program Files\WinMerge\WinMergeU.exe -e -x -ub -dl %bname -dr %yname %base %mine

Однако можно все еще использовать TortoiseMerge путем содержания клавиши Shift при нажатии на Diff в контекстном меню. Содержание клавиши Shift заставляет TortoiseSVN использовать TortoiseMerge вместо настроенной разности или инструмента слияния.

мне также нравится CommitMonitor, который покажет Вам новое действие в репозитории.

Наконец, существуют хорошие советы в tortoisesvn.net .

24
задан pushkin 8 March 2018 в 04:01
поделиться

5 ответов

Using LINQ:

var sortedList = _allStatInfo.OrderBy(si => si.date).ToList();

Sorting the original list:

_allStatInfo.Sort(new Comparison<StatInfo>((x, y) => DateTime.Compare(x.date, y.date)));
61
ответ дан 28 November 2019 в 22:16
поделиться

Я вижу, что вы все равно получили ответ, но ...

  1. Вы можете избежать некоторого уродства, просто разделив утверждение на две половины:

     Comparison  compare = (x, y) => DateTime.Compare (x.date, y.date);
    _allStatInfo.Sort (сравнение);
    

    Возможно, вы захотите просто вызвать CompareTo напрямую:

     Comparison  compare = (x, y) => x.date.CompareTo (y.date);
    _allStatInfo.Sort (сравнение);
    
  2. Вы можете создать реализацию IComparer , используя мой класс ProjectionComparer - это часть MiscUtil , и я включил версию без комментариев в нижней части этот ответ. Затем вы должны написать:

     _allStatInfo.Sort (ProjectionComparer  .Create (x => x.date));
    
  3. Даже если вы используете .NET 2.0, вы все равно можете использовать LINQ через LINQBridge .

Вот класс ProjectionComparer , необходимый для второго ответа. Первая пара классов на самом деле просто помощники, позволяющие лучше работать с обобщенным выводом типов.

public static class ProjectionComparer
{
    public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
        (Func<TSource, TKey> projection)
    {
        return new ProjectionComparer<TSource, TKey>(projection);
    }

    public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
        (TSource ignored, Func<TSource, TKey> projection)
    {
        return new ProjectionComparer<TSource, TKey>(projection);
    }

}

public static class ProjectionComparer<TSource>
{
    public static ProjectionComparer<TSource, TKey> Create<TKey>
        (Func<TSource, TKey> projection)
    {
        return new ProjectionComparer<TSource, TKey>(projection);
    }
}

public class ProjectionComparer<TSource, TKey> : IComparer<TSource>
{
    readonly Func<TSource, TKey> projection;
    readonly IComparer<TKey> comparer;

    public ProjectionComparer(Func<TSource, TKey> projection)
        : this (projection, null)
    {
    }

    public ProjectionComparer(Func<TSource, TKey> projection,
                              IComparer<TKey> comparer)
    {
        projection.ThrowIfNull("projection");
        this.comparer = comparer ?? Comparer<TKey>.Default;
        this.projection = projection;
    }

    public int Compare(TSource x, TSource y)
    {
        // Don't want to project from nullity
        if (x==null && y==null)
        {
            return 0;
        }
        if (x==null)
        {
            return -1;
        }
        if (y==null)
        {
            return 1;
        }
        return comparer.Compare(projection(x), projection(y));
    }
}
15
ответ дан 28 November 2019 в 22:16
поделиться

Чтобы проиллюстрировать ответ Роберта К. Картаино:

public class StatInfo : IComparable<StatInfo>
{
    public string contact;
    public DateTime date;
    public string action;

    public int CompareTo(StatInfo value)
    {
        return this.date.CompareTo(value.date);
    }
}

var _allStatInfo = new List<StatInfo>();

// this now sorts by date
_allStatInfo.Sort();

Не самое общее решение, но хорошее если вы собираетесь сортировать только по дате. И, как сказал Роберт, вы всегда можете изменить сортировку по умолчанию, передав параметр IComparer методу сортировки.

4
ответ дан 28 November 2019 в 22:16
поделиться

Используйте лямбда-выражение для сопоставления пары для сравнения:

_allStatInfo.Sort((x, y) => x.date - y.date);
3
ответ дан 28 November 2019 в 22:16
поделиться

Для DateTime не должно быть необходимости сравнивать.

_allStatInfo.OrderyBy(d => d.date);

или

_allStatInfo.OrderByDescending(d => d.Date);
1
ответ дан 28 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: