根据位置删除重复

时间:2015-02-27 08:15:01

标签: c# linq list

我在C#中有两个如下所示的列表。

List 1 = [{Item="A",position =1},{Item="B",position =2},{Item="A",position =3}]
List 2 = [{Item="AA",position =1},{Item="BB",position =2},{Item="AC",position =3}]

现在我想删除列表1中的重复值,并且应该在列表2中删除该位置。

示例o / p

   List 1 = [{Item="A",position =1},{Item="B",position =2}]
    List 2 = [{Item="AA",position =1},{Item="BB",position =2}]

任何人都可以帮助我。谢谢。

2 个答案:

答案 0 :(得分:1)

List<string> lst1 = new List<string> { "A", "B", "A" };
List<string> lst2 = new List<string> { "AA", "BB", "AC" };

HashSet<string> seen = new HashSet<string>();

for (int i = 0; i < lst1.Count; i++) {
    if (!seen.Add(lst1[i])) {
        lst1.RemoveAt(i);
        lst2.RemoveAt(i);
        i--;
    }
}

我使用HashSet来“保存”lst1的“已经看到”的元素,然后简单地循环lst1并删除重复的元素。 true如果HashSet还没有元素false,则返回public class MyObject { public string Item; public int Position; } List<MyObject> lst1 = new List<MyObject> { new MyObject { Item = "A", Position = 1 }, new MyObject { Item = "B", Position = 2 }, new MyObject { Item = "A", Position = 3 }, }; List<MyObject> lst2 = new List<MyObject> { new MyObject { Item = "AA", Position = 1 }, new MyObject { Item = "BB", Position = 2 }, new MyObject { Item = "AC", Position = 3 }, }; HashSet<string> seen = new HashSet<string>(); HashSet<int> toBeDeleted = new HashSet<int>(); for (int i = 0; i < lst1.Count; i++) { if (!seen.Add(lst1[i].Item)) { toBeDeleted.Add(lst1[i].Position); lst1.RemoveAt(i); i--; } } if (toBeDeleted.Count > 0) { for (int i = 0; i < lst2.Count; i++) { if (toBeDeleted.Contains(lst2[i].Position)) { lst2.RemoveAt(i); i--; } } // or equivalent and shorter, without the for cycle //lst2.RemoveAll(x => toBeDeleted.Contains(x.Position)); }

目前还不清楚你想要什么/你拥有什么,但是这里有另一个可能用例的解决方案:

lst1

在这种情况下,在Position的第一次传递中,我们删除了重复的项目(如第一个示例中所示)并“保存”HashSet<int> tobedeleted需要删除的lst2 {{1}}然后我们对{{1}}进行第二次传递,以删除需要删除的元素。

答案 1 :(得分:1)

很不清楚你想做什么,但我试着用这个:

var filteredList1 = list1.GroupBy(x => x.Item).Select(g => g.First()).ToList(); 
var removeElements = list2.Where(f => !filteredList1.Any(t => t.Position == f.Position)).ToList();  
removeElements.ForEach(x => list2.Remove(x));