【问题标题】:Casting List of type string to DeviceInfo[]将字符串类型列表转换为 DeviceInfo[]
【发布时间】:2016-06-04 20:31:25
【问题描述】:

是否可以将类型字符串列表转换为 DeviceInfo[]。我正在获取计算机上的逻辑驱动器列表并将其转换为列表以删除我的系统目录(我的操作系统目录)。现在我想将该列表转换回 DeviceInfo[],因为我需要获取具有更多可用空间的逻辑驱动器。

DriveInfo[] drive = DriveInfo.GetDrives();
List<string> list = drive.Select(x => x.RootDirectory.FullName).ToList();
list.Remove(Path.GetPathRoot(Environment.SystemDirectory).ToString());

谢谢。

【问题讨论】:

    标签: c# driveinfo


    【解决方案1】:

    你不必这样做Select()

    DriveInfo[] driveFiltered = drive.Where(x => x.RootDirectory.FullName != Path.GetPathRoot(Environment.SystemDirectory).ToString()).ToArray();
    

    编辑:

    正如@MarkFeldman 所指出的,Path.GetPathRoot() 会针对DriveInfo[] 上的所有项目进行评估。对于这种特殊情况,这不会产生影响(除非您有几十个硬盘驱动器),但它可能会给您带来不良的 LINQ 习惯 :)。有效的方法是:

    string systemDirectory = Path.GetPathRoot(Environment.SystemDirectory).ToString();
    DriveInfo[] driveFiltered = drive.Where(x => x.RootDirectory.FullName != systemDirectory).ToArray();
    

    【讨论】:

    • 我对此的唯一批评是 Path.GetPathRoot(Environment.SystemDirectory).ToString() 将针对循环的每次迭代进行评估。在这个非常简单的例子中它是无关紧要的,但是像这样的事情有一个习惯,以后会回来困扰你,所以养成正确实施事情的习惯是件好事(即使“正确”意味着“可能有点慢但可扩展” )。最好将该值缓存在 LINQ 表达式之外的局部变量中。
    • @MarkFeldman 确实,我对此进行了内部斗争,但赢得我的是“他可以拥有多少驱动器......”但这是真的,我会编辑我的答案。谢谢!
    【解决方案2】:

    为什么不直接使用这样的东西呢?

    List&lt;DriveInfo&gt; list = DriveInfo.GetDrives().Where(x =&gt; x.RootDirectory.FullName != Path.GetPathRoot(Environment.SystemDirectory).ToString()).ToList();

    这样可以避免转换为字符串列表,并保留原始 DriveInfo[] 数组的类型。

    【讨论】:

    • 该死,有人打败了我......不过,GetPathRoot 方法调用同上——这是你想要存储在查询之外的东西。
    【解决方案3】:

    下面的代码将显示最大的可用空间;

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    namespace ConsoleApplication11
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                long FreeSize = 0;
                DriveInfo[] drive = DriveInfo.GetDrives().Where(x =>
                {
                    if (x.RootDirectory.FullName != Path.GetPathRoot(Environment.SystemDirectory).ToString() && x.AvailableFreeSpace >= FreeSize)
                    {
                        FreeSize = x.AvailableFreeSpace; 
                        Console.WriteLine("{0}Size:{1}", x.Name, x.AvailableFreeSpace);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }).ToArray();
    
                Console.ReadLine();
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2021-10-15
      • 2020-07-25
      • 1970-01-01
      • 2019-05-18
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多