2013-04-29 2 views
1

3 개의 문자열이 있는데, 3 줄의 레이블에 넣고 싶습니다. 레이블이 들어가서 고정 된 높이가되어야하므로 각 문자열이 1 줄만 차지하도록해야합니다. 즉, 각 문자열의 길이를 ~ 20 자로 유지하려고합니다. 문제는 문자열이 < 20 문자이므로 예외가 발생하므로 레이블에 쓰는지 여부를 평가해야합니다. 내가 뭘하려String.Format 제 3의 표현의 결과를 기반으로?

했다 : 분명히

mobPartLabel.Text = String.Format(
    "String 1: {0} \nString 2: {1} \nString 3: {2}", 
     (string1.Length >= 20 ? string1.Substring(0, 19) : string1), 
     (string2.Length >= 20 ? string2.Substring(0, 19) : string2), 
     (string3.Length >= 20 ? string3.Substring(0, 19) : string3)); 

이 작동하지 않았다. : - \ 근본적으로 내가 성취하고자하는 바입니다. 이 멍청한 질문을 용서해주십시오. 나는 제 3 차 연산자를 처음 사용합니다. 나는 그들이 무엇인지, 무엇을하는지 알고 있지만, 지금까지는 아무 것도 구현할 이유를 찾지 못했습니다.> _

내가 잘못하고있는 것에 대한 제안이 있거나 전혀 불가능한 경우, 더 나은 방법은 무엇일까요? "문자열 1"

  string string1 = "Rawr"; 
      string string2 = "Rawr2"; 
      string string3 = "Rawr3"; 

      mobPartLabel.Text = String.Format(
       "String 1: {0} \nString 2: {1} \nString 3: {2}", 
        (string1.Length >= 20 ? string1.Substring(0, 19) : string1), 
        (string2.Length >= 20 ? string2.Substring(0, 19) : string2), 
        (string3.Length >= 20 ? string3.Substring(0, 19) : string3)); 

내 모든 레이블이 말한다이 코드를 사용하여

편집이며, 그것 뿐이다. 그것이 완전하고 완전한 라벨입니다. :(

+6

"이 기능이 작동하지 않음" 세부 묘사. 나는 당신의 마지막'string2'가'string3'이어야한다고 생각합니다 .... –

+1

또한, SO를위한 코드를 포맷 할 때 여러 줄을 사용하여 수평으로 스크롤하지 않도록하십시오. –

+1

string3을 가지고 있다는 뜻의 끝에 string2가 있다는 점을 제외하면 내가 한 일에 어떤 문제가 있는지 알 수 없습니다. 당신은 그것이 작동하지 않는다고 말한다. 문제가 정확히 무엇입니까? – antlersoft

답변

3

귀하의 코드가 잘 작동합니다. 아마 뭔가를 라벨 자체. 의 속성/크기 당신이하는 것 같은이 불필요한 복잡성을 추가 할 수있다?

+0

그게 다야! 미안해, 모두들!나는 그것을 고려조차하지 않았다! {0} 지나서 인쇄되지 않는 것처럼 보이게하는 위치에서 끊어졌습니다! –

3

또한 false로 AutoSize 속성을 설정 되세요 .NET 및 C#,하지만 문자열에서 제공하는 Enumerable에서 유형에 LINQ 확장 방법을 사용하여 새로운 일, 우리가 실제로 내가 믿는이 더 단순화하고 다음과 같이 변경을 할 수 있습니다. 틀림없이이 더 간단 할 수

using System.Linq; 
{... other usings and namespace/type declarations ...} 

     string string1 = "Rawr"; 
     string string2 = "Rawr2"; 
     string string3 = "Rawr3"; 

     mobPartLabel.Text = String.Format(
      "String 1: {0} \nString 2: {1} \nString 3: {2}", 
       (string1.Take(20)), 
       (string2.Take(20)), 
       (string3.Take(20))); 

을 Enumerable.Aggregate()를 사용하지만 코드에 친숙하지는 않습니다. 너에게 소개해. 여기에서 중요한 점은 Take 메서드가 자연스럽게 문자열 클래스의 일부가 아니라 개발자의 문법 설탕을 추가하기 위해 클래스 디자인을 봉인 한 후에 추가 된 extension methodEnumerable.Take(...)입니다.

Linqlambda expressions을 사용하여 유창한 쿼리 표현식을 사용할 수 있도록 설계된 확장 방법을 사용하여 여러 가지 BCL 유형 (특히 Enumerable)을 확장합니다. Linq는 희미한 마음으로 C#을 사용하지 않고 사용할 수 있지만 람다 식과 마찬가지로 빠르게 보편화되고 있으므로 사용법을 일찍 인식하는 법을 배우는 것이 중요합니다. 위임자, 인터페이스, 특히 IEnumerable과 C# 언어와의 특별한 관계를 이해할 때 자신을 배울 준비가되어 있다고 생각하십시오 (예 : foreachyield)

+0

+1 짧은 구문과 가독성에 대해서는 +1하지만이 방법을 사용하면 문자열이 null이 아닌지 확인해야합니다. 그리고 마지막에 여분의 ')'를 그리워합니다. ;-) – Koen

+0

코드가 실패해도 문자열이 null이라고 가정합니다. Null 검사는이 문제 도메인과 관련이 없지만 업스트림 값 확인 및 온 전성 검사로 제한되어야합니다. – Firoso

+1

참. 내 발언은 무시해도 돼. 또한 주제에 대한 좋은 추가 설명. – Koen

관련 문제