2014-01-21 3 views
0

Я ищу наиболее эффективный способ поиска большого массива класса. У меня есть множество плит и вам нужно найти их по ID, единственный способ, которым я придумал, ниже, хотя я уверен, что есть намного более быстрые способы, возможно, какой-то Array.Find, но я не уверен в правильности синтаксис. Любая помощь будет принята с благодарностью.Лучший способ поиска массива классов

class Program 
{ 
    public static tiles[,] tile = new tiles[100,100]; 
    static void Main(string[] args) 
    { 
     for (int x = 0; x < 100; x++) 
     { 
      for (int y = 0; y < 100; y++) 
      { 
       if (tile[x, y].ID == 2) 
       { 
        // DO SOMETHING 
       } 
      } 
     } 
    } 
} 

public class tiles 
{ 
    public int _ID; 
    public int ID 
    { 
     get { return _ID; } 
     set { _ID = value; } 
    } 
} 
+0

Что заставляет вас думать, что это не самый лучший способ? Кроме того, используйте уникальные имена в верхнем регистре (например, 'Tile') ... если нет веской причины для плюрализации – musefan

+0

В вашем случае существует не более чем последовательный поиск. Если вам действительно нужно сделать это быстро, помимо «плиток», держите дополнительный словарь ссылок с ключом «ID». –

+0

Если данные будут как-то отсортированы, вы должны воспользоваться этим (например, двоичный поиск), в противном случае то, что вы делаете, возможно * так же хорошо, как и получается – Alex

ответ

1

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

В вашем случае, поскольку вы, кажется, хотите найти фрагмент по его идентификатору, я предлагаю вам использовать дополнительный Dictionary<int, Tile>, где Id является ключом, для получения определенной плитки в амортизированном времени O (1) вы не возражаете против дополнительного пространства и предполагаете, что вам нужно только извлечь фрагмент, а не его индекс в массиве). Вы все равно можете использовать двумерный массив для получения фрагмента по его индексу.

Плюсы:

  • Найти плитку по идентификатору в амортизируется O (1) время.

Минусы:

  • дополнительное пространство
  • вам необходимо обновить словарь всякий раз, когда вы обновляете массив
+0

Это комментарий, а не ответ. –

+0

@HenkHolterman - обновлен. – dcastro

+0

Спасибо, я считал словарь, но это всего лишь один пример массива, мой код имеет много отформатированных одинаково, поэтому будет очень грязно с множеством и большим количеством словарей. Мне просто нужно написать какой-то код для поиска по любому массиву, а не писать его индивидуально каждый раз. – user3208483

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