处理查找列表中相继出现的项目的最佳方法是什么?

发布于 2024-08-04 20:19:16 字数 514 浏览 2 评论 0原文

我有一个像这样的类,

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 中可用的选项

I have a class like this

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

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

I have an unordered list of these History Entries, and I do Exists statements to see if an entry exists in the list.

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

Now I need to change this so that this method returns whether or not a Cancelled entry exists after the TimeStamp of the last Cleared entry if one exists, otherwise just return whether a Cancelled entry exists at all.

I'm limited to options available in .Net 2.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倚栏听风 2024-08-11 20:19:16

像这样的事情怎么样:

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

}

How about something like this:

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

I'm using C#2.0 syntax...

Oh and one more thing, make sure your HistoryEntry class implements 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);
    }

}
安穩 2024-08-11 20:19:16

搜索列表中匹配条目的索引,这需要两次搜索。

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

Search for the index of the matching entries in the list, which requires two searches.

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);

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文