2011-02-07 4 views
1

Я открыл пять notepad.exe. Теперь я хочу знать все идентификаторы процесса, связанные с каждым notepad.exe.Получить строку [] или идентификатор процесса из процесса [] с помощью LINQ

Я знаю, что можно получить список блокнота процессов пути:

процесса [] процессы = Process.GetProcessesByName ("блокнот");

Но теперь я хочу, чтобы строка [] идентификаторов процесса этих экземпляров блокнота использовала LINQ. Как мне это сделать? Я знаю, что могу создать строку [] и использовать цикл foreach заполнить строку [], но я хотел бы знать, используя LINQ.

+5

Stringly напечатал данных является злом. – Snowbear

+0

@Snowbear: хотя я вообще согласен (я подтвердил ваш комментарий), я не вижу много неправильного использования PID в качестве строк (несмотря на то, что они уже переданы вам как ints и потребление памяти).Несмотря на то, что они представлены цифрами, они не пригодны для каких-либо числовых вычислений. Они являются идентификаторами, и строки могут хорошо соответствовать этой роли. –

+1

@Martinho, Process.GetProcessById (int id) http://msdn.microsoft.com/en-us/library/76fkb36k.aspx? – Snowbear

ответ

3

Вы можете использовать:

Process[] processes = Process.GetProcessesByName("notepad"); 
string[] ids = processes.Select(p => p.Id.ToString()).ToArray(); 

Однако я вопрос о необходимости положить это в string[] типа. Может быть, лучше просто оставить Process.Id значения в виде целых чисел:

Process[] processes = Process.GetProcessesByName("notepad"); 
var ids = processes.Select(p => p.Id); 
foreach(int processId in ids) 
{ 
    // Do something with each processId 
} 
4

Вы могли бы сделать один-лайнер, используя преобразование в массив вместо LINQ:

int[] processIds = Array.ConvertAll(Process.GetProcessesByName("notepad"), 
            p => p.Id); 

Чтобы получить список процессов идентификаторов:

Process[] processes = Process.GetProcessesByName("notepad"); 
var processIdList = processes.Select(p => p.Id).ToList(); 

Чтобы получить массив вместо списка вы можете делать:

var processIdList = processes.Select(p => p.Id).ToArray(); 

Обратите внимание, что процесс Идентификатор типа int. Если вы хотите, список строк, вместо этого вы можете просто сделать это:

var processIdList = processes.Select(p => p.Id.ToString()).ToArray(); 
+0

Или если вы хотите 'string []' вызывать 'ToArray()' вместо 'ToList()'. Если все, что вы хотите сделать, - это цикл через идентификатор один раз, вам не нужно вызывать любой метод, потому что 'Select()' возвращает IEnumerable. –

+0

@Joel: Правильно, я добавил 'ToArray()' - это, по-видимому, наиболее близко отражает то, что ОП задал для – BrokenGlass

1
var ids = Process 
    .GetProcessesByName("notepad") 
    .Select(process => process.Id) 
    .ToArray(); 
6

Вы можете написать

var ids = Array.ConvertAll(Process.GetProcessesByName("notepad"), p => p.Id); 

Это будет (немного) быстрее, чем Select и ToArray, так как он не будет необходимо изменить размер массива.

Если вы можете использовать IEnumerable<int> вместо массива, то Select (без ToArray) будет быстрее.

+0

hah +1 Я знал, что вы опубликуете это, когда я сделаю мое редактирование, чтобы сделать то же самое - я даже подумал, что SLaks сделал бы это таким образом ;-) – BrokenGlass

+0

Я не понимаю бит «изменить размер». Я думал, что цепочки вызовов 'Select' и' ToArray' не будут содержать никакого изменения размера, потому что 'Select' использует отложенное выполнение и размер массива вычисляется непосредственно перед его созданием. Я здесь не прав? Благодарю. –

+1

@gaearon: 'ToArray()' не имеет способа узнать, насколько большой массив должен быть. ('Select' не может передавать исходный размер) Изменения происходят внутри' ToArray() '. – SLaks

1

Большинство ответов сосредоточено на создании string [] из Process [].
Но зачем вам нужен массив?

Если вам нужно всего лишь перебрать все элементы позже, вам не нужно выделять память для другого массива. Вместо этого используйте IEnumerable<T>, возвращенный Select.

var ids = Process 
    .GetProcessesByName("notepad") 
    .Select(process => process.Id); // returns IEnumerable<int> 

foreach (var id in ids) 
    DoSomethingWith (id); 

Вы можете выбрать строку представлений точно так же, или вы можете проецировать ids, а также:

var stringIds = ids.Select (id => id.ToString()); // returns IEnumerable<string> 
+0

(это то, что я имел в виду под последней строкой в ​​моем ответе) – SLaks

+0

Извините за дублирование, я не заметил, что вы упомянули об этом. Должен ли я удалять ответ, если он пересекается с другим? –

Смежные вопросы