2015-07-13 5 views
0

Предположим, у нас есть список контейнеров, каждый из которых является объектом. В каждом контейнере есть несколько объектов.Как найти пересечение между коллекциями

Как найти все дублированные объекты, которые совместно используются в двух или более контейнерах?

Каждый контейнер имеет идентификатор, имя, список объектов как свойство. Каждый объект имеет идентификатор и имя.

Пожалуйста, смотрите изображение:

enter image description here

Результат должен быть, как:

------------- 
Object1.Name  
Object2.Name  
Object3.Name 
------------- 

Я использовал неверный код

public class Container 
    { 
     public string ID; 
     public string Name; 
     public string Top, Left, Right, Bottom; 
     public List<ObjectX> Objects = new List<ObjectX>(); 

    } 



public class ObjectX 
    { 
     public string ID; 
     public string Name; 
     public string Top, Left, Right, Bottom; 

    } 


List<Container> AllBoundaries = new List<Container>(); 
      List<ObjectX> all_components = new List<ObjectX>(); 
      Container b1 = new Container(); 
      b1.Name = "Boundary1"; 
      b1.ID = "1"; 
      AllBoundaries.Add(b1); 

      Container b2 = new Container(); 
      b2.Name = "Boundary2"; 
      b2.ID = "2"; 
      AllBoundaries.Add(b2); 

      Container b3 = new Container(); 
      b3.Name = "Boundary3"; 
      b3.ID = "3"; 
      AllBoundaries.Add(b3); 
//---------------------------------------------------------------------------------------- 
      ObjectX c1 = new ObjectX(); 
      c1.ID = "1"; 
      c1.Name = "c1"; 
      b1.Objects.Add(c1); 

      ObjectX c2 = new ObjectX(); 
      c2.ID = "2"; 
      c2.Name = "c2"; 
      b1.Objects.Add(c2); 

      ObjectX c3 = new ObjectX(); 
      c3.ID = "3"; 
      c3.Name = "c3"; 
      b1.Objects.Add(c3); 

      ObjectX c22 = new ObjectX(); 
      c22.ID = "2"; 
      c2.Name = "c2"; 
      b2.Objects.Add(c2); 

      foreach (Container bx1 in AllBoundaries) 
      { 

       foreach (Container bx2 in AllBoundaries) 
       { 
        for (int i = 1; i < bx2.Objects.Count; i++) 

         if (bx1.ID != bx2.ID) 
         { 
          List<ObjectX> query = bx1.Objects.FindAll(bx => bx.Name == bx2.Objects[i].Name); 
          Console.WriteLine(bx2.Objects[i].Name + " Distributed"); 
          bx2.Objects.Remove(bx2.Objects[i]); 
         } 

       } 
      } 

Но это дает мне все объекты от 1 до 9, что неверно.

+0

Я думаю, что вопрос просто создать [SSCCE] (http://sscce.org/). Как насчет создания полностью содержащегося примера (также показывающего ожидаемый результат), чтобы мы могли копировать/вставлять и тестировать его. – EZI

+0

Что случилось? –

+0

Я не хочу создавать тестовый пример, который может и не быть тем, что вы ожидаете. – EZI

ответ

0

Предполагая, что у вас есть набор контейнеров, вы сотрудничаете сделайте следующее:

var item = from c in containers 
      from o in c.Objects 
      group c.ContainerName by o into g 
      where g.Distinct().Count() > 1 
      select g.Key; 
+0

Это работает ОК, все в порядке, спасибо :) –

Смежные вопросы