2012-02-23 3 views
1

Хорошо. Теперь этот вопрос может показаться вам странным, но я должен его решить. Теперь вопрос прост. Позвольте мне объяснить на хорошем примереКак логические и (^, логические соединения) строковые списки - C#

Допустим, что у меня есть следующие строковые списки. Каждая строка представляет собой список, и эти списки будут логическим операции AND enter image description here

my,car,fly,surf,buy 
house,home,car,fly,buy 
fly,king,rock,buy,sell 
fly,buy,home,rock,sell 

Хорошо, если логически и выше списки результат будет

fly,buy 

Потому что те 2 являются единственными же элементы в этих списках , Теперь, как я могу достичь этого самого быстрого времени выполнения с C# 4.0? Спасибо

C#, C# -4,0

+0

быстрый с точки зрения выполнения, или быстро с точки зрения времени разработки? Кроме того, я бы рекомендовал не оптимизировать время выполнения, пока не будет найдено правильное решение. [Вставить обязательную цитату Кнута здесь] –

+0

Теперь это самое быстрое время выполнения, а не время разработки. Спасибо. Хотя я все еще хотел бы услышать быстрые методы времени разработки тоже :) – MonsterMMORPG

ответ

1

Вы можете использовать HashSet<T>:

IEnumerable<T> IntersectAll(IEnumerable<T> lists) 
{ 
    var set = new HashSet<T>(lists.First()); 

    foreach (var other in lists.Skip(1)) 
    { 
     set.IntersectWith(other); 
    } 

    return set; 
} 
+0

Я думаю, что это лучшее и простое решение для реализации :) Спасибо за ответ. – MonsterMMORPG

6

Вы можете использовать Intersect метод, данное LINQ. Например:

List<string> a = new List<string>() {"my","car","fly","surf","buy"}; 
List<string> b = new List<string>() {"house","home","car","fly","buy" }; 

var c = a.Intersect(b); 

Дает автомобиль, летает и покупает. Повторите перекресток на c для остальной части ваших строк, чтобы получить полное пересечение.

+0

Спасибо, смотря довольно хорошо. Попытаемся сейчас. – MonsterMMORPG

1
List<List<string>> lists = //whatever 
HashSet<string> set = new HashSet<string>(lists[0]); 

for(int i = 1; i < lists.Count; i++) 
{ 
    set.IntersectWith(lists[i]); 
} 

с помощью LINQ вы можете использовать:

var intersection = lists.Aggregate((l1, l2) => l1.Intersect(l2).ToList()); 
Смежные вопросы