3

文字列配列を使用せずに、string[]リストに2つの文字列を追加したいと思います。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[]。したがって、stringsを個別に追加する場合は、追加できません。ただし、の単一要素インスタンスに単一要素として追加できますstring[]。したがって:

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

それらをの2要素インスタンスの2要素として使用する場合は、次のようにstring[]言います。

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

率直に言って、私は周りを回ることList<string[]>は本当に厄介だと思います。List<string[]>大きな懸念の1つは、の構造と各要素の各要素の意味を詳しく知るために、発信者に非常に大きな負担をかけていることです。さらに、変更するのは堅牢ではありません(またはの任意の要素の単一の要素の意味を変更したい場合、または要素を追加したい場合は、メンテナンスの悪夢List<string[]>があります。より正式なデータ構造を検討することをお勧めします。あなたの懸念をより適切にカプセル化します。

于 2012-05-02T13:54:08.907 に答える
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 に答える
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

リストは文字列配列で構成されているため、文字列配列以外のものをリストに追加することはできません。

2つの文字列で構成されるオブジェクトを作成することもできますが、それが目的に合っている場合は、オブジェクトを追加する前にそのオブジェクトを初期化する必要があります。

于 2012-05-02T13:55:36.773 に答える