我有
var a = new object();
var b = new object();
var c = new object();
var d = new object();
var e = new object();
var list = new List<object> {a, b, c, d, e, a, d};
Run Code Online (Sandbox Code Playgroud)
然后我需要删除最后两个对象(a和d),因为它们已经在列表中.
如何在不创建新列表的情况下完成此操作?
如果你打电话list.Remove就会删除第一个实例; 但是,你可以使用list.RemoveAt和list.RemoveRange.例如:
list.RemoveRange(5,2);
Run Code Online (Sandbox Code Playgroud)
或更好:不要首先添加它们.
例如,如果要从序列添加,则可以在添加时使用Distinct或HashSet<T>查找唯一项.
事实之后,您可以使用:
var dups = from item in list
group item by item into grp
where grp.Count() > 1
select grp.Key;
foreach (var val in dups)
{
int first = list.IndexOf(val), last;
while ((last = list.LastIndexOf(val)) != first)
{
list.RemoveAt(last);
}
}
Run Code Online (Sandbox Code Playgroud)
删除除第一个重复实例之外的所有实例.
或者更高效:
for (int i = 0; i < list.Count; i++ )
{
var val = list[i];
int first = list.IndexOf(val), last;
while ((last = list.LastIndexOf(val)) != first)
{
list.RemoveAt(last);
}
}
Run Code Online (Sandbox Code Playgroud)