当List包含相同的对象而不创建新列表时,从List <object>中删除对象

jim*_*zer 0 c# linq

我有

 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),因为它们已经在列表中.
如何在不创建新列表的情况下完成此操作?

Mar*_*ell 5

如果你打电话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)