Храните значения в коллекции, пожалуйста, предложение - PullRequest
1 голос
/ 28 марта 2011

Начинающий вопрос. Какой тип коллекции я должен использовать для хранения такой структуры?

Files collection
---------------
FileId: Int
FileName : String
Path: String

Мне нужно будет сохранить данные нескольких файлов в эту коллекцию, найти поле Path по FileId, удалить элемент по полю FileId.

Ответы [ 4 ]

8 голосов
/ 28 марта 2011

Я бы создал Dictionary с пользовательским классом в качестве значения:

public class FileInfo
{
    public string FileName {get;set;}
    public string Path {get;set;}
}

и сохранил бы его в словаре Dictionary<int, FileInfo>, где вы сохраняете FileId в качестве ключа Dictionary.

6 голосов
/ 28 марта 2011

Поскольку у вас есть несколько предопределенных фрагментов информации, которые вы хотите связать с каждым экземпляром значения, я бы начал с определения структуры для хранения информации, необходимой для каждого файла:

public struct CustomFileInfo  //pick a name that avoids conflicts with System.IO
{
    public readonly int FileId;
    public readonly string FileName;
    public readonly string Path;

    // constructor
    public CustomFileInfo(int fileId, string fileName, string path)
    {
        this.FileId = fileId;
        this.FileName = fileName;
        this.Path = path;
    }
}

А затем ябудет использовать универсальную коллекцию (например, List<T>) для хранения экземпляров этой структуры:

List<FileInfo> myFiles = new List<FileInfo>();

В качестве альтернативы, вы можете использовать Dictionary<TKey, TValue>с FileId в качестве ключа и структурой FileInfo в качестве значения.Например:

Dictionary<int, FileInfo> myFiles = new Dictionary<int, FileInfo>();

Преимущество словаря состоит в том, что он обеспечивает более быстрое время поиска при поиске файла по его идентификатору.Это связано с тем, что словарь реализован внутри с использованием хеш-таблицы.

РЕДАКТИРОВАТЬ: Обратите внимание, что изменяемые структуры являются злыми .Если вам необходимо изменить отдельные элементы информации, которые описывают файл (и я не могу представить, почему вы это сделаете), вы должны объявить CustomFileInfo как class вместо struct.

3 голосов
/ 28 марта 2011

Возможны несколько подходов.

Предполагая такую ​​структуру:

  class File
  {
    int FileId { get; set; }
    string FileName { get; set; }
    string Path { get; set; }
  }

Простой общий список
Вы можете хранить свои данные в простомобщий список:

List<File> File { get; set; }

Наблюдаемая коллекция
Если вам нужно привязать коллекцию к пользовательскому интерфейсу WPF, а ее содержимое обновляется откуда-то из вашего кода, я предлагаю:

ObservableCollection<File> Files { get; set; }

Словарь
Если FileId уникален и это единственное свойство, которое вы используете для поиска элементов, вы можете поместить их в словарь, например:

Dictionary<int, File> File { get; set; }
2 голосов
/ 28 марта 2011

Создать File класс:

public class File
{
    public int Id { get; private set; }
    public string Path { get; private set; }
    public string FileName
    {
        get
        {
            return System.IO.Path.GetFileName(this.Path);
        }
    }
    public File(int id, string path)
    {
        this.Id = id;
        this.Path = path;
    }
}

Затем вы можете сохранить объекты в List<File>:

List<File> files = GetFiles();
files.RemoveAll(f => f.Id == 42);

.. или в Dictionary<int, File>:

Dictionary<int, File> files = GetFiles(); // GetFiles should use File.Id as key
files.Remove(42);

Преимущество Dictionary в том, что у вас чрезвычайно эффективный поиск ключа. Плюсом List является то, что вы обладаете гибкостью и можете легко писать код для удаления на основе любого значения содержащихся в нем объектов File, таких как:

files.RemoveAll(f => f.Path.Contains("stuff"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...