Каков наилучший способ обработки поиска предметов в списке, который произошел за другим? - PullRequest
0 голосов
/ 09 сентября 2009

У меня есть такой класс

public class HistoryEntry
{
    DateTime Date{ get; protected set; }
    HistoryType EntryType { get; protected set; }
}

public enum HistoryType
{
    Cancelled,
    Cleared,
    Redeemed,
    Refunded
}

У меня есть неупорядоченный список этих записей истории, и я делаю операторы Exists, чтобы посмотреть, существует ли запись в списке.

return Entries.Exists(e => e.EntryType == HistoryEntryType.Cancelled);

Теперь мне нужно изменить это так, чтобы этот метод возвращал, существует ли существующая Отмененная запись после метки времени последней Очистленной записи, если таковая существует, в противном случае просто возвращается, существует ли вообще Отмененная запись.

Я ограничен опциями, доступными в .Net 2.0

Ответы [ 2 ]

1 голос
/ 09 сентября 2009

Как насчет этого:

    private bool ContainsCanceled(List<HistoryEntry> list)
    {
        list.Sort();
        int index = list.FindLastIndex(delegate(HistoryEntry h) { return h.HistoryType == HistoryType.Cleared; });
        for (int i = index >= 0? index : 0; i < list.Count; i++)
        {
            if (list[i].HistoryType == HistoryType.Cancelled)
            {
                return true;
            }
        }

        return list.Exists(delegate(HistoryEntry h) { return h.HistoryType == HistoryType.Cancelled; });
    }

Я использую синтаксис C # 2.0 ...

Да, и еще одна вещь, убедитесь, что ваш класс HistoryEntry реализует IComparable:

public class HistoryEntry : IComparable<HistoryEntry>
{
    public DateTime Date { get; set; }
    public HistoryType HistoryType { get; set; }

    public int CompareTo(HistoryEntry other)
    {
        return this.Date.CompareTo(other.Date);
    }

}
0 голосов
/ 09 сентября 2009

Поиск по индексу совпадающих записей в списке, который требует двух поисков.

int p = Entries.FindIndex(e => e.EntryType == HistoryEntryType.Cleared);
if (p < 0)
    p = 0;
p = Entries.FindIndex(p, e => e.EntryType == HistoryEntryType.Cancelled);
return (p >= 0);

См. http://msdn.microsoft.com/en-us/library/efasdh0s.aspx.

...