请将值存储到收集中,建议

时间:2011-03-28 10:18:02

标签: .net collections types

新手问题。我应该使用什么样的集合类型来存储这样的结构?

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

我需要将几个文件数据存储到该集合中,找到Path by FileId字段,通过FileId字段删除项目。

4 个答案:

答案 0 :(得分:8)

我会创建一个Dictionary,其自定义类为值:

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

并存储在Dictionary<int, FileInfo>字典中,并将FileId作为Dictionary中的关键字。

答案 1 :(得分:6)

由于您需要与每个值实例关联的多个预定义信息,我首先要定义一个结构来保存每个文件所需的信息:

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>();

字典的优点在于,它在通过ID搜索文件时提供更快的查找时间。这是因为字典是使用哈希表在内部实现的。

编辑:请注意mutable structs are evil。如果您需要能够更改描述文件的各条信息(我无法想象为什么会这样做),您应该将CustomFileInfo声明为class而不是{{1} }}

答案 2 :(得分:3)

有几种可能的方法。

假设这样的结构:

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

简单通用列表
您可以将数据保存在一个简单的通用列表中:

List<File> File { get; set; }

可观察的收藏
如果您需要将集合绑定到WPF UI并且其内容从代码中的某个位置更新,我建议:

ObservableCollection<File> Files { get; set; }

<强>词典
如果FileId是唯一的,并且它是您用来查找项目的唯一属性,则可以将它们放入如下字典中:

Dictionary<int, File> File { get; set; }

答案 3 :(得分:2)

创建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"));