Приведение списка типа строки в DeviceInfo[]

Можно ли привести список типа строки в DeviceInfo[]. Я извлекаю список логических дисков на моем компьютере и добавляю его в список, чтобы удалить системный каталог (каталог "Моя операционная система"). Теперь я хочу привести этот список обратно к DeviceInfo [], так как мне нужно получить логический диск, на котором больше свободного места.

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

Благодарю вас.

3 ответа

Решение

Вам не нужно делать 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();

Почему бы просто не использовать что-то подобное?

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

Это позволит избежать преобразования в список строк и сохранить тип исходного массива DriveInfo[].

Код ниже покажет максимально доступное пространство;

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

        }
    }
}

Снимок экрана 1

Другие вопросы по тегам