2011-03-23 2 views
2

질문 내가 할 수있는 다음과 같은 값을 포함하는 일반 목록이은 LINQ에 의해 일반적인 목록에서 값을 사용하여 문자열을 포맷

업데이트 :

Sector 1 
Sector 2 
Sector 4 

또는 다음 값 :

All Sectors 

이 값을 다음과 같은 문자열 형식으로 지정하고 싶습니다.

Sector 1 & 2 & 4 - 

또는

All Sectors - 

현재, 나는 같은 형식으로 다음과 같은 코드가 있습니다. 그것은 작동하지만 매우 복잡합니다.

string retrieveSectors += sectors.Count == 0 
           ? string.Empty 
           : sectors.OrderBy(
           y => 
           y.Sector.Substring(
           y.Sector.Length - 1, 1)). 
           GroupBy(g => g.Sector).Select(
           g => g.First()).ToList().Aggregate(
           retrieveSectors, 
           (current, y) => 
           (current == retrieveSectors 
           ? current + 
           y.Sector 
           : current + " & " + 
           y.Sector. 
           Substring(
           y.Sector. 
           Length - 1, 1))) + " - " 

위의 코드에서 변수 섹터는 제네릭 목록입니다. 누군가가 결과를 단순화 된 방법으로 얻을 수 있도록 도와 줄 수 있습니까? 또는 더 이해할 수 있도록 위의 코드를 수정할 수도 있습니다.

도움을 주시면 감사하겠습니다. 감사합니다

+0

얼마나 많은 섹터가 존재합니까 ??? – renatoargh

+0

위의 업데이트 된 질문에서 언급했습니다. 목록에는 "모든 섹터"또는 "섹터 1, 섹터 2, 섹터 4"가 포함될 수도 있고 비어있을 수도 있습니다. 세 가지 시나리오 모두에 대한 솔루션이 필요합니다. 업데이트 된 질문을 확인하십시오 – reggie

+0

확실한 답을 얻었습니다. 아래를보십시오! – renatoargh

답변

1

어쩌면 조금 더 간단 :

string retrieveSectors = 
     string.Format(
     "sectors {0} -", 
     sectors.Select(s => s.Replace("sector ", "").Replace("|", "")) 
      .OrderBy(s => s) 
      .Aggregate((a, b) => string.Format("{0} & {1}", a, b)) 
     ); 
+0

"모든 섹터 (All Sectors)"가 작동하면 해결책이 작동하지 않습니다. 질문을 확인하십시오. 다시 업데이트했습니다. 이전 것을 유감으로 생각합니다. – reggie

+0

또한 일반 목록이 비어 있으면 오류가 발생합니다. – reggie

1

이 밖으로 시도! 대한

List<String> list = new List<String>() { "Sector 1", "Sector 2", "Sector 4" }; 

(list.Count == 0 ? "Not any sector " :  
((list.Contains("All Sectors") ? "All Sectors " : 
    "Sector " + String.Join(" & ", list.OrderBy(c => c).ToArray()) 
     .Replace("Sector", String.Empty)))) + " - " 

는 또한 작동 : 섹터가 저장된 IEnumerable<string> 어떤 종류가 source 가정

List<String> list = new List<String>(); 
List<String> list = new List<String>() { "All Sectors" }; 
0

, 아마 더 간결한 구문은 다음과 같습니다

String.Join(" & ", source).Replace(" Sector ", " ") 

또는이, source 힘 경우 순서가 지정되지 않고 주문 된 섹터 번호를 원함 :

String.Join(" & ", source.OrderBy(s => s)).Replace(" Sector ", " ") 

그리고 마지막으로, 궁극적 인 세련미는 "전혀 부문"레나토의 대답처럼 확인하기 :

source.Any() ? String.Join(" & ", source.OrderBy(s => s)).Replace(" Sector ", " ") : "No sectors" 

이 모든 솔루션은 단순히 (처음에 언급 한 두 경우에 어쨌든 작동

, 2 후자 합리적으로 발생하고 관심을 가질만한 추가 사례를 다루기 위해 향상된 버전입니다.)

+0

너무 나쁘지 않아서, 나는 kevev22 대답에 Aggregate를 사용하는 것을 좋아합니다. 솔루션 중 어느 것이 더 효과적인지 궁금합니다. – JTew