如何将多个字符串添加到列表<字符串[]>

本文关键字:字符串 列表 添加 | 更新日期: 2023-09-27 18:32:51

我想在不使用字符串数组的情况下将两个字符串添加到 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;
}

如何将多个字符串添加到列表<字符串[]>

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

。但是,即使在那里,为什么您希望可用空间作为字符串?

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[]>中任何元素的任何一个元素的含义,或者如果您想添加其他元素,您将面临维护噩梦。 您可能需要考虑一种更正式的数据结构,以更恰当地封装您的问题。

你不能这样做吗?

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

不过,这只是句法糖。

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

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

是的,你可以这样做:

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

您可以使用单个 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);