3

我想在不使用字符串数组的情况下将两个字符串添加到字符串 [] 列表中。我使用了一个名为 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;
}
4

6 回答 6

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

...但是,即使在那里,您为什么要将可用空间作为字符串?

于 2012-05-02T13:56:13.413 回答
2

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

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

如果您希望它们作为 的双元素实例的两个元素string[],您会说:

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

坦率地说,我认为传递 aList<string[]>真的很讨厌。一个主要的担忧是,您给调用者带来了非常沉重的负担,因为您需要深入了解 的结构List<string[]>以及每个元素的每个元素的含义。此外,更改起来并不健壮(如果您想更改其中任何元素的任何单个元素的含义,或者如果您想添加其他元素,那么您将面临维护的噩梦List<string[]>。您可能需要考虑一个更正式的数据结构,更恰当地概括了您的顾虑。

于 2012-05-02T13:54:08.907 回答
0

你不能这样做吗?

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

不过,这只是语法糖。

于 2012-05-02T13:52:27.407 回答
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();
于 2012-05-02T13:55:05.780 回答
0

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

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

于 2012-05-02T13:55:36.773 回答
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);
于 2012-05-02T13:56:44.960 回答