如何向List <string []>添加多个字符串?</string []>

时间:2012-05-02 13:51:10

标签: c#

我想在不使用字符串数组的情况下将两个字符串添加到string []列表中。我使用了一个名为str的字符串数组,但我想直接将d.Name和d.AvailableFreeSpace添加到列表中。有没有办法做到这一点?

public static List<string[]> GetReadyDrives()
{
    DriveInfo[] drives = DriveInfo.GetDrives();
    List<DriveInfo> readyDrives = new List<DriveInfo>();
    List<string[]> parsedReadyDrives = new List<string[]>();

    for (int i = 0; i < drives.Length; i++)
    {
        if (drives[i].IsReady)
        {
             readyDrives.Add(drives[i]);
        }
    }
    foreach (DriveInfo d in readyDrives)
    {
        string[] str=new string[2];
        str[0] = d.Name;
        str[1] = d.AvailableFreeSpace.ToString();
        parsedReadyDrives.Add(str);
    }
    return parsedReadyDrives;
}

6 个答案:

答案 0 :(得分:3)

public static List<string[]> GetReadyDrives()
{
    return DriveInfo.GetDrives()
        .Where(d => d.IsReady)
        .Select(d => new[] { d.Name, d.AvailableFreeSpace.ToString() })
        .ToList();
}

...但是,说实话,你最好这样做:

class ReadyDriveInfo
{
    public string Name { get; set; }
    public string AvailableFreeSpace { get; set; }
}

public static List<ReadyDriveInfo> GetReadyDrives()
{
    return DriveInfo.GetDrives()
        .Where(d => d.IsReady)
        .Select(d => new ReadyDriveInfo
            {
                Name = d.Name,
                AvailableFreeSpace = d.AvailableFreeSpace.ToString()
            })
        .ToList();
}

...但是,即使在那里,你为什么要将自由空间作为字符串?

答案 1 :(得分:2)

List<string[]>的每个元素都是string[]的实例。因此,如果您想单独添加string,则不能。但是您可以将它们添加为string[]的单个元素实例中的单个元素。因此:

parsedReadyDrives.Add(new[] { d.Name });
parsedReadyDrives.Add(new[] { d.AvailableFreeSpace.ToString());

如果你想将它们作为string[]的双元素实例的两个元素,你会说:

parsedReadyDrives.Add(new[] { d.Name, d.AvailableFreeSpace.ToString() });
坦率地说,我认为绕过List<string[]>真的很讨厌。一个主要的问题是,你给调用者带来了沉重的负担,要密切了解List<string[]>的结构以及每个元素的每个元素的含义。此外,改变不健全(如果您想要更改List<string[]>中任何元素的任何一个元素的含义,或者您想添加其他元素,那么您有维护噩梦您可能想要考虑更正式的数据结构,更恰当地包含您的问题。

答案 2 :(得分:0)

你能不能这样做吗?

parsedReadyDrives.Add(new []{d.Name, d.AvailableFreeSpace.ToString()});

但这只是语法糖。

答案 3 :(得分:0)

是的,你可以这样做:

parsedReadyDrives.Add(new string[]{d.Name, d.AvailableFreeSpace.ToString()});

所以尝试使用一些LINQ。而不是你的代码尝试这个来返回你想要的:

return DriveInfo.GetDrives().Where(x => x.IsReady).Select(x => new string[]{x.Name, x.AvailableFreeSpace.ToString()}.ToList();

答案 4 :(得分:0)

您的列表由字符串数组组成,所以不,您不能向不是字符串数组的列表添加内容。

您可以创建一个由两个字符串组成的对象,如果这对您尝试执行的操作更有意义,但在添加之前您仍需要初始化该对象。

答案 5 :(得分:0)

您可以使用单个LINQ查询执行此操作:

public static List<string[]> GetReadyDrives()
{
    return DriveInfo.GetDrives()
        .Where(d => d.IsReady)
        .Select(d => new string[] { d.Name, d.AvailableFreeSpace.ToString() })
        .ToList();
}

更新: 我拆分代码找到准备好的驱动器和代码,准备写入文件的内容。在这种情况下,我不需要查看内部方法来理解字符串数组中包含的内容:

public static IEnumerable<DriveInfo> GetReadyDrives()
{
    return DriveInfo.GetDrives()
        .Where(d => d.IsReady);
}

然后写下你需要的东西:

foreach(var drive in GetReadyDrives())
    WriteToFile(drive.Name, drive.AvailableFreeSpace);

甚至这种方式(但我更喜欢描述方法名称的选项):

foreach(var drive in DriveInfo.GetDrives().Where(d => d.IsReady))
    WriteToFile(drive.Name, drive.AvailableFreeSpace);