2017-02-07 2 views
0

Предположив У меня есть List<int> его легко найти целое число, позволяет сказать 6Как искать в междунар [] в списке <int[]> и удалить элемент в C#

List<int> list = new List<int>(){1, 2, 3, 4, 5}; 
if(list.Contains(6)) 
    Console.Write("6 exists"); 

, но как бы я искать int[] в List<int[]>

List<int[]> example = new List<int[]>(); 
example.Add(new int[4]{0,1,2,3}); 
example.Add(new int[4]{10,11,12,13}); 
example.Add(new int[4]{20,21,22,23}); 

Как искать {0,1,2,3}, а также удалить этот индекс в списке?

int[] toFind = new int[4]{0,1,2,3}; 
foreach (int[] item in list) 
{ 
    if(item.Length == toFind.Length) 
    { 
     bool found = false; 
     for(int i=0; i < item.Length;i++) 
     { 
      if(item[i] == toFind[i]) 
      { 
       found = true; 
      } 
      else 
      { 
       found = false; 
      } 
     } 
    } 
} 

Я пытался сперва сравнить желаемую длину предмета с каждой длиной элемента, сравнить каждый элемент массива. Там должен быть лучший способ сделать это ...

ответ

6

Вы можете использовать FindIndex() и расширение Linq SequenceEquals:

int index = list.FindIndex(arr => arr.Length == toFind.Length && arr.SequenceEqual(toFind)); 
if (index >= 0) list.RemoveAt(index); 

Обратите внимание, что SequenceEqual возвращает true только тогда, когда элементы последовательности находятся в одной заказ. Таким образом, {1,2,3,4} - это не то же самое, что и {2,1,4,3}.

+0

Обратите внимание, что это будет относительно медленным для поиска больших источников данных. [Используя алгоритм Бойера-Мура] (http://stackoverflow.com/questions/16252518/boyer-moore-horspool-algorithm-for-all-matches-find-byte-array-inside-byte-arra) может дать вам значительный прирост производительности. –

+1

@ScottChamberlain Я согласен, это не самый быстрый способ. Возможно, OP указывает в вопросе, что означает «лучший способ»: быстрее, читабельнее или что-то еще. –

+0

да, на самом деле хотелось бы более быстрый способ – Edgar

1

Вам не разрешено изменять объект List в цикле foreach, но вместо этого вы можете использовать цикл for.

private void removeFromList(List<int[]> list, int[] compare) { 
    for (int i = 0; i < list.Count; i++) { 
     if (list[i] == compare) { 
     list.RemoveAt(i); 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^