2011-02-07 6 views
1

다섯 개의 notepad.exe를 열었습니다. 이제 각 notepad.exe와 연관된 모든 프로세스 ID를 알고 싶습니다.LINQ를 사용하여 문자열 [] 또는 프로세스 ID를 가져옵니다.

은 내가하여 메모장 프로세스의 목록을 검색 할 수 있습니다 알고 : = Process.GetProcessesByName ("메모장")

프로세스 [] 공정;

하지만 이제 LINQ를 사용하는 메모장 인스턴스의 프로세스 ID 문자열 []을 원합니다. 어떻게해야합니까? 나는 문자열 []을 만들 수 있고 foreach 루프를 사용하여 문자열 []을 채울 수 있지만 LINQ를 사용하는 것을 알고 싶습니다.

대신 LINQ의 1 라이너 사용하여 배열을 변환 할 수
+5

Stringly 입력 된 데이터가 악이다. – Snowbear

+0

@Snowbear : 나는 일반적으로 동의한다. (나는 당신의 의견을 전복했다.) 나는 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

:

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

과정 이드 형 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

당신은

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

를 작성할 수 SelectToArray,보다 빠른이 될 것입니다 (약간) 이후는하지 않습니다 배열 크기를 조정해야합니다.

배열 대신 IEnumerable<int>을 사용할 수있는 경우 Select (ToArray 제외)이 빠릅니다.

+0

하하 +1 나는 동일한 작업을 수행하기 위해 편집 작업을 수행 할 때 게시 할 것이라는 것을 알고있었습니다. SLaks 이런 식으로 할 것입니다 ;-) – 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

중복으로 인해 미안합니다. 다른 답변과 교차하는 경우 답변을 삭제해야합니까? –

관련 문제