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