2012-05-02 89 views
3

我想將兩個字符串添加到字符串[]列表中,而不使用字符串數組。我使用了一個名爲str的字符串數組,但我想直接將d.Name和d.AvailableFreeSpace添加到列表中。有沒有辦法做到這一點?如何添加多個字符串到列表<string[]>?

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

請僞代碼打印出來正是你想要你的'名單'的內容看起來像在到底是什麼。我現在不太清楚。 –

+1

我在Linqpad中運行了它,它爲我工作。你有什麼問題? –

+0

您可以通過創建一個帶'Name'和'AvailableFreeSpace'屬性的Drive類來改進您的設計,而不是返回'string []'列表,然後返回這些列表。或者只是返回一個'DriveInfo'列表。不要將'AvailableFreeSpace'轉換爲一個字符串,直到您確實需要一個字符串時纔會打印該值。 –

回答

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

...但是,即使在那裏,爲什麼你要的自由空間作爲一個字符串?

0

你不能這樣做嗎?

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

雖然這只是語法糖。

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[]>中任何元素的任何一個元素的含義,或者您想要添加其他元素,則可能需要更正式地考慮更改(如果要更改維護夢魘 。更適當地封裝您的關注數據結構

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

你的列表是由字符串數組組成的,所以不能,你不能在列表中添加一些不是字符串數組的東西。

您可以創建一個由兩個字符串組成的對象,如果這對您正在嘗試執行的操作更有意義,但仍然必須在添加對象之前對其進行初始化。

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); 
相關問題