2016-02-23 3 views
0

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

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

Thank you.

ответ

2

Вы не должны делать Select()

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

EDIT:

Как @MarkFeldman отметил, Path.GetPathRoot() получает оценку для всех элементов на DriveInfo[]. Это не повлияет на этот конкретный случай (если у вас нет десятков жестких дисков), но это может привести к плохой привычке LINQ :). Эффективным способом будет:

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

Моя единственная критика в том, что 'Path.GetPathRoot (Environment.SystemDirectory) .ToString()' будет оцениваться для каждой итерации цикла. Это неслучайно на этом очень простом примере, но у таких вещей есть привычка возвращаться, чтобы преследовать вас позже, поэтому хорошо привыкнуть к тому, чтобы правильно реализовывать вещи (даже когда «правильно» означает «вероятно, немного медленнее, но масштабируемо»,). Лучше всего кэшировать это значение в локальной переменной вне выражения LINQ. –

+1

Спасибо Tyress. Это работает. (: – Partha

+1

@MarkFeldman действительно, у меня была внутренняя битва об этом, но то, что выиграло меня, было «сколько дисков он может иметь право ...», но это правда, я отредактирую свой ответ. Спасибо! – Tyress

0

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

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

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

+1

Дарн, кто-то избил я к этому ... То же самое касается метода метода GetPathRoot, - это то, что вы хотите сохранить вне запроса. – PSGuy

0

В приведенном ниже коде будет показано самое свободное место;

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

     } 
    } 
} 

Screenshot 1