2010-04-26 5 views

답변

30

를 (상단 답 참조)

var replacedNames = names.Select(x => x.Replace("pdf", "txt")); 

우리는 names의 유형을 잘 모르겠지만, 당신은 그것을 다시 지정하려면 당신은 잠재적으로 ToArray 또는 ToList을 사용할 수

// If names is a List<T> 
names = names.Select(x => x.Replace("pdf", "txt")).ToList(); 
// If names is an array 
names = names.Select(x => x.Replace("pdf", "txt")).ToArray(); 

당신은 알고 있어야합니다 당신이 모든 비록 순간에 LINQ를 사용하지 않는 게시 한 코드 ...

21

문자열, 그래서 s.Replace 새로운 문자열이 반환됩니다 (변경되지 않음) 불변)이 아마추어 소리 경우 LINQ 아주 새로운 여전히

foreach (string s in names) 
{ 
    s.Replace("pdf", "txt"); 
} 

오전 그래서 나를 용서 다음과 같이 내 코드는 . 아쉽게도 이것은 업데이트를 수행 할 때 foreach을 사용할 수 없음을 의미합니다. 이름은 배열의 경우이 작업을해야합니다 : 그것은 모두 StringBuilder를 사용하는 것이 좋습니다하지만 당신의 부탁 때문에

for(int i = 0; i < names.Length; i++) 
{ 
    names[i] = names[i].Replace("pdf", "txt"); 
} 
+2

IT는'목록 '도 작동합니다. _Length_를 _Count_로 대체하십시오. –

0

s.Replace가 함수 인 것은 .. s.Replace() =. 그 쉬운 ... 당신은 당신이 LINQ 솔루션 후 왔다고

+4

왜 StringBuilder를 사용하면 더 좋을까요? * 같은 * 문자열에 대해 여러 번 대체가 수행되는 것과는 다릅니다. –

3

다른 사람들이 언급했듯이 이것을 수행하려면 for 루프를 사용해야합니다. 그러나 작업을 내부에서 수행 할 필요가없는 경우 (즉, 결과가 다른 콜렉션이 될 수 있음) linq 쿼리로도 처리 할 수 ​​있습니다.

var results = from name in names select name.Replace("pdf", "txt"); 

일부 파일 이름의 확장자를 변경하려는 것 같습니다. 그게 당신이하려는 경우 그 목적을 위해 특별히 설계된 Path.ChangeExtension을 권하고 싶습니다.

var results = from name in names select Path.ChangeExtension(name, "txt"); 
+1

여기에 쿼리 표현식을 사용하면 과도한 것처럼 보입니다. 단일 Select를 수행하는 중이라면 직접 호출하지 않는 이유는 무엇입니까? +1 Path.ChangeExtension. –

+0

@ 존 - 쿼리 표현식이 더 멋지게 보이고 읽기가 더 쉽다고 생각합니다. 그것은 모두 동일한 코드로 컴파일되고, 몇 가지 여분의 문자를 입력해도 실제로 나를 괴롭히지 않습니다. 스킵/테이크 (take)/테이크 (take)를 사용하거나 목록으로 변환하는 것과 같은 쿼리에서 표현할 수없는 작업을하고 있다면 확장 메서드를 직접 사용할 수 있습니다. –

+0

개인적인 취향이라고 생각합니다 ... 좀 더 복잡해지면 쿼리 표현을 좋아하지만, 단일 필터 또는 단일 프로젝션을 수행하는 경우 쿼리 표현이 덜 직접적으로 보입니다. –

관련 문제