2015-07-02 3 views
1

У меня есть некоторые списки, сделанные с использованием некоторых условий в C# .. Таким образом, если какое-либо условие является ложным, список остается пустым .. но мне все же нужно пересечь его с другими списками, чтобы получить окончательный вывод .. любые предложения, как это сделать ?Как пересечь несколько списков, если один из них будет пустым?

+0

«... некоторые списки, использующие некоторые условия ...» Можете ли вы уточнить, что у вас есть, что вы хотите, что вы пробовали и что не получилось? В настоящее время это не совсем понятно. –

+0

Просьба предоставить некоторые образцы кода, которые вы пробовали. Это поможет другим пользователям понять вопрос более ясным. – Golda

+1

Вам нужно пересечь пустой список с непустым? Результат ВСЕГДА будет пустым, понимаете? – HimBromBeere

ответ

1

Enumerable.Intersect позволяет это сделать, даже если один IEnumerable<T> пуст.

Однако, как только имеется хотя бы один пустой список, результат пересечения всегда будет пустым - это то, что вам нужно?

+0

Я думаю, что список может быть пустым в некоторых условиях, не всегда – fred

+1

Это тоже мое понимание. Я отредактировал свой ответ, чтобы уточнить, какой диапазон «всегда» я имею в виду. ;) – nodots

0

Если я вас правильно понял, вы могли бы использовать Count свойство

List<Object> your_list = new List<Object>(); 
if(your_list.Count!=0){ 
// do your stuff 
} 
else{ 
//skip 
} 
1

Итак, после того, как у вас есть все ваши списки, поместить их в массив, то вы можете сделать, как показано ниже образец (предположим, у вас есть все списки строк)

 var list1 = new List<string>(); 
     var list2 = new List<string>(); 
     var list3 = new List<string>(); 

     var allLists = new List<string>[] { list1, list2, list3 }; 
     // need to be sure you have >= 1 list(s) 
     var result = allLists[0]; 

     for (int i = 1; i < allLists.Length; i++) 
     { 
      result = result.Intersect(allLists[i]).ToList(); 
     } 

     // ok, you get the result 
+0

Я пересек список, как сказал Мэтт! – Rasika

3

Как простой статический метод:

static IEnumerable<T> Intersect<T>(params IEnumerable<T>[] lists) 
{ 
    return lists.Where(l => l.Any()).Aggregate((l1, l2) => l1.Intersect(l2)); 
} 

Вы можете использовать его как

var list1 = new List<string>() { "abc", "cde" }; 
var list2 = new List<string>() { "abc", "xyz" }; 
var list3 = new List<string>(); 

var arrayOfLists = new List<string>[] {list1, list2, list3}; 

var paramList= Intersect(list1, list2, list3); 
var arrayList = Intersect(listOfLists); 

Будьте осторожны, чтобы передать массив вместо списка, в противном случае T является список, который возвращает первоначальный список.

+0

Спасибо .. !! это помогло! – Rasika

+1

Добро пожаловать. Я был бы признателен отметить это как ответ, если бы это было правильное решение. – Matt

+0

Это должно быть добавлено в .NET Framework по умолчанию. –

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