2011-02-28 2 views
7

public class Abbreviation 
{ 
    public string ShortName { get; set; } 
    public string LongName { get; set; } 
} 

이 같은 약어 개체의 목록이 있습니다문자열 C#에서 Linq에를 사용하여 교체


List abbreviations = new List(); 
abbreviations.add(new Abbreviation() {ShortName = "exp.", LongName = "expression"}); 
abbreviations.add(new Abbreviation() {ShortName = "para.", LongName = "paragraph"}); 
abbreviations.add(new Abbreviation() {ShortName = "ans.", LongName = "answer"}); 

string test = "this is a test exp. in a para. contains ans. for a question"; 

string result = test.Replace("exp.", "expression") 
... 

내가 기대했던 결과는 : 는 "이 단락에서 테스트 표현 인에 대한 대답을 포함을 질문 "

은 현재 내가 뭐하는 거지 :


foreach (Abbreviation abbreviation in abbreviations) 
{ 
    test = test.Replace(abbreviation.ShortName, abbreviation.LongName); 
} 
result = test; 

와트 더 나은이 있다면 궁금 Linq와 Regex의 조합을 사용합니다. 당신이 정말로 당신의 코드를 단축하고 싶다면

+3

LINQ 아래 하나가 모든 문제에 대한 해결책이 아니다 시도 , 당신이 쓴 것은 괜찮습니다. – Phill

답변

9

, 당신은 ListForEach 확장 방법을 사용할 수 있습니다

abbreviations.ForEach(x=> test=test.Replace(x.ShortName, x.LongName)); 
+4

기술적으로 이것은 LINQ가 아닙니다 ;-) – BrokenGlass

+1

기술적으로 프로그래밍이 아닙니다. http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx – RPM1984

+0

항상 평소보다 나은 방법이 있습니다. 그것은 위대한 작품. 너와 마이크 덕분에. – gangt

2

당신은 foreach 문이 방법을 사용할 수 있습니다. 또한, 모두 StringBuilder는 문자열의 작업을보다 효율적으로해야합니다

var test = new StringBuilder("this is a test exp. in a para. contains ans. for a question"); 
abbreviations.ForEach(abb => test = test.Replace(abb.ShortName, abb.LongName)); 
return test.ToString(); 
1

이 하나

TestList.ForEach(x => x.TestType.Replace("", "DataNotAvailable")); 

또는

foreach (TestModel item in TestList.Where(x => x.ID == "")) 
{ 
    item.ID = "NoDataAvailable"; 
}