按名称

时间:2017-12-12 12:28:31

标签: c#

我希望有一些列表,我可以通过名称访问,也可以通过它来访问。

我有一堆我想要创建的子目录,如下所示:

List<string> names = new List<string>();  
foreach (var name in names)  
{  
    Directory.CreateDirectory(name);  
}

但是,我也希望轻松访问各个名称,如下所示:

Directory.CreateDirectory(Path.Combine(names.subdir1, "Something"));  

我想到了ValueTuples:你可以在元组中命名字段,但我认为你不能以任何方式通过元组进行迭代。

或者字典是最好的方式吗?

Dictionary<string, string> names = new Dictionary<string, string>();
foreach (var name in names)
{
    Directory.CreateDirectory(name.Value);
}

if (names.TryGetValue("subdir1", out string value))
{
    Directory.CreateDirectory(Path.Combine(value, "Something"));
}

有更好的方法吗?谢谢!

更新

如果我使用新课程怎么样:

public class SubDirNames
{
    public SubDirNames()
    {

    }
    public const string subdir1 = "Something";
    public const string subdir2 = "Something Else";
}


SubDirNames names = new SubDirNames();
string temp = names.subdir1;

有没有办法在课堂上浏览这些字段?还可以通过名称subdir1和subdir2?

访问它们

更新2:

好的,我会再试一次澄清我喜欢做什么:我必须创建大约20个子文件夹。我只想在程序中定义这些子文件夹的名称。所以这是一个很好的方法:

List<string> namesOfSubFolders = new List<string>
{
    "Datasets",
    "Docs",
    "Manual",
    "Visu1",
    "Visu2"
};

string projectPath = @"C:\Project";
string workingDir = Directory.GetCurrentDirectory();

foreach (var subFolder in namesOfSubFolders)
{
    Directory.CreateDirectory(Path.Combine(projectPath, subFolder));
}

现在对于其中一些子文件夹,我必须做一些额外的操作。例如:我需要复制子文件夹“Docs”中的一些文件。我可以想到两种方法来做到这一点,两者都不是很好:

File.Copy(Path.Combine(workingDir, "file.txt"), Path.Combine(projectPath, "Docs"));

File.Copy(Path.Combine(workingDir, "file.txt"), Path.Combine(projectPath, namesOfSubFolders[1]));

在第一行中,我重复了子文件夹的名称,在第二行中,我不知道我要复制的子文件夹。还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

如果您坚持names.subdir1语法,可以尝试使用ExpandoObject(实现IDictionary<string, object>接口):

  using System.Dynamic;

  ...

  dynamic names = new ExpandoObject();

  names.subdir1 = @"C:\MyDir\MySubDir1";
  names.subdir2 = @"C:\MyDir\MySubDir2";

  Directory.CreateDirectory(Path.Combine(names.subdir1, "Something"));

  // Do we have "subdir3" key?
  if ((names as IDictionary<string, object>).ContainsKey("subdir3")) {
    ...
  }

如果names["subdir1"]语法正常,您可以尝试使用Dictionary<string, string>

  Dictionary<string, string> names = new Dictionary<string, string>() {
    {"subdir1", @"C:\MyDir\MySubDir1"},
    {"subdir2", @"C:\MyDir\MySubDir2"},
  };

  Directory.CreateDirectory(Path.Combine(names["subdir1"], "Something"));