2011-02-07 10 views
1

notepad.exeを5つ開きました。今私は各notepad.exeに関連付けられているすべてのプロセスIDを知りたい。私はによってメモ帳プロセスのリストを取得することができる知っているLINQを使用して文字列[]またはプロセスIDをプロセス[]から取得

プロセス[]プロセス= Process.GetProcessesByName( "メモ帳")。

しかし、LINQを使用しているノートパッドインスタンスのプロセスIDのstring []が必要です。それ、どうやったら出来るの?私は文字列[]を作成し、foreachループを使用して文字列[]を作成することができますが、LINQの使用を知りたいと思います。

+5

Stringly入力されたデータは悪です。 – Snowbear

+0

@Snowbear:私は一般的に同意しますが(私はあなたのコメントをupvoted)、私は文字列としてPIDを持つことはあまり間違って表示されません(彼らはあなたのintとしてすでに与えられているにもかかわらず、数値で表現されていても、数値計算には使用できません。それらは識別子であり、文字列はその役割に適しています。 –

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

プロセスIDのリストを取得するには、次の代わりにすることができますリストの配列を取得するには

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

を操作を行います。

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

プロセスIdがタイプintであることに注意してください。あなたは文字列のリストを望んでいた場合は代わりにあなただけのこの操作を行うことができます:

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

また、 'ToList()'の代わりに 'string []'を呼び出して 'ToArray()'を呼び出そうとしています。 'Select()'がIEnumerableを返すので、あなたがしたいのはidの一回のループです。どちらのメソッドも呼び出す必要はありません。 –

+0

@Joel:正しい、私はToArray()を追加しました - これはOPが尋ねたものを最もよく反映しているようです – BrokenGlass

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

ことがないので、あなたは、これが速くSelectToArrayよりも(少し)となります

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

を書くことができます配列のサイズを変更する必要があります。

アレイの代わりにIEnumerable<int>を使用できる場合、SelectToArrayなし)は高速になります。

+0

hah +1同じことをするために私の編集をしたときにあなたがこれを投稿することを知っていました - このようにします;-) – BrokenGlass

+0

私は '配列のサイズを変更する'ビットを理解していません。 'Select'は遅延実行を使用し、配列サイズは作成直前に計算されるため、' Select'と 'ToArray'呼び出しの連鎖はサイズ変更を伴わないと考えました。私はここで間違っていますか?ありがとう。 –

+1

@gaearon: 'ToArray()'は、配列の大きさを知る方法がありません。 ( 'Select'は元のサイズを渡すことができません)サイズ変更は' ToArray() 'の内部で行われます。 – SLaks

1

ほとんどの回答は、Process []のうちstring []の作成に集中しています。
しかし、どうしてアレイが必要なのですか?

あなたがする必要があるのは、後ですべての項目をループするだけであれば、別の配列にメモリを割り当てる必要はありません。代わりにSelectで返されたIEnumerable<T>を使用してください。あなたは、文字列を選択することができ

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

重複して申し訳ありません、私はあなたがそれを言及したことに気付かなかった。別のものと交差する場合、回答を削除する必要がありますか? –

関連する問題