我已经找到了从通用列表< T>中删除重复项的解决方案了。在.NET 2.0中如下:
List<CaseStudy> caseStudies = CaseStudyDAO.FindCaseStudiesByDate(DateTime.Now.Date, DateTime.Now.Date.AddDays(1));
caseStudies.RemoveAll(
delegate(CaseStudy c)
{
return caseStudies.IndexOf(c) != caseStudies.FindIndex(
delegate(CaseStudy f) { return c.Str == f.Str; });
});
我的问题是:
有更有效的方法吗?只有.NET 2.0解决方案
上述解决方案的复杂性是什么?
谢谢,
jan2k10
答案 0 :(得分:12)
RemoveAll的时间复杂度为O(n)。索引的时间复杂度是O(n),因此这是O(n ^ 2)时间复杂度的总和。我认为空间复杂度为O(1)。
有更有效的方法吗?是。如果您愿意花费更多空间,可以在O(n)时间复杂度下完成。
答案 1 :(得分:5)
为了扩展Eric关于O(n)时间的评论,如果你乐意使用更多空间,我会做这样的事情:
Dictionary<string, CaseStudy> lookup = new Dictionary<string, CaseStudy>();
foreach (CaseStudy cs in caseStudies)
{
lookup[cs.Str] = cs;
}
caseStudies = new List<CaseStudy>(lookup.Values);
几点说明:
这会更改caseStudies
的值以引用新列表。如果您希望它在同一个List<T>
内,您可以使用:
caseStudies.Clear();
caseStudies.AddRange(lookup.Values);
这会使列表中的 last 元素保持每个不同的Str
值。那只是为了让它尽可能短。如果您想要第一个元素,请使用:
foreach (CaseStudy cs in caseStudies)
{
if (!lookup.ContainsKey(cs.Str))
{
lookup[cs.Str] = cs;
}
}