2012-04-24 4 views
4

내가하고 싶은 것은 길이에 관계없이 Console.Writeline 메서드를 통해 출력 한 텍스트를 완벽하게 정렬하는 것입니다.콘솔에서 텍스트 출력을 정렬 하시겠습니까?

Example: 
// Notice that no matter the length of the text on the left, 
// the text on the right is always spaced at least 5 spaces. 

    this is output   text 
    this is also output  text 
    output     text 
    my output    text 

내 자신의 메서드를 작성해야할까요, 아니면 .Net에 이미 사용할 수있는 내용이 있습니까?

+0

미리 왼쪽 열 값을 모두 갖고 있습니까? 그렇다면 가장 긴 문자열을 찾고 표준 문자열 서식을 사용하십시오. – R0MANARMY

+0

내용이 파싱 된 후 입력에 따라 생성되지 않습니다. – user1172635

답변

2

이와 비슷한 내용이 도움이 될 것입니다. 바라기를 바꿔서 당신의 요구에 맞게 조정할 수 있기를 바랍니다.

string[] outputs = { 
         "this is output", 
         "this is also output", 
         "output", 
         "my output" 
        }; 

// order outputs in descending order by length 
var orderedOutputs = outputs.OrderByDescending(s => s.Length); 

// get longest output and add 5 chars 
var padWidth = orderedOutputs.First().Length + 5; 

foreach (string str in outputs) 
{ 
    // this will pad the right side of the string with whitespace when needed 
    string paddedString = str.PadRight(padWidth); 
    Console.WriteLine("{0}{1}", paddedString, "text"); 
} 
+3

좋은 해결책. 제안 :'var padWidth = outputs.Max (o => o.Length) +5; ' –

+0

아, 네, 그게 참으로 좋습니다. –

2

.NET 문자열 서식을 설명하는 this 페이지를 살펴볼 수도 있습니다. 수동 PadLeftPadRight 대신 형식 문자열에서 패딩 크기를 직접 선언 할 수 있습니다.

의 라인을 따라 뭔가
var offset = outputs.Max(s => s.Length); 
var formatString = "{0,-" + offset + "}  {1}"; 

foreach(var dataPoint in /*[your collection of data points]*/) 
{ 
    Console.WriteLine(formatString, /*[first value]*/, /*[second value]*/); 
} 
+0

감사합니다. 이것이 내가 필요한 것입니다. 또한 해시 테이블 키를 사용하여 가장 효율적인 방법을 말해 줄 수 있습니까? 현재 해시 테이블에서 CopyTo 메서드를 사용하여 키를 문자열 배열로 덤프 한 다음 위에 게시 한 코드를 배열에 사용하고 있습니다. 어쨌든 배열에 넣지 않고이 작업을 수행 할 수 있습니까? – user1172635

+1

@ user1172635 .NET 1.1 코드를 대상으로하지 않는 경우 (또는 해당 프레임 워크로 작업하는 경우) ['Dictionary'] (http://msdn.microsoft.com/en-us/library/xfhwa508)를 사용해야합니다. aspx) [http : //msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx]보다는 ['Hashtable]. 'HashTable '을 절대적으로 사용해야한다면, [MSDN] (http://msdn.microsoft.com/en-us/library/system.collections.dictionaryentry.aspx)에서 직접 루프를 돌리는 방법의 예가 있습니다. . 나는 또한 질문하기 전에 MSDN에서 물건을 찾는 습관을 강하게 권합니다. – R0MANARMY

2

Linq 대신에 생각해!

var outputs = new List<string>() { 
         "this is output", 
         "this is also output", 
         "output", 
         "my output" 
        }; 

var size = outputs.Max (str => str.Length) + 5; 

Console.WriteLine ( 
      string.Join(Environment.NewLine, 
         outputs.Select (str => str.PadRight(size) + "Text")) 
        ); 

/* 
this is output   Text 
this is also output  Text 
output     Text 
my output    Text 
*/ 
+0

그 이유는 무엇입니까? – user1172635

+1

Linq는 데이터를 시각화하고 처리하는 매우 역동적 인 방법입니다. Max와 같은 IEnumerable의 확장 메서드를 사용하면 데이터를 고유 한 투영으로 변환하는 Select의 힘이 매우 강력합니다. 확장 메서드를 사용하여 데이터 목록을 조작하는 방법 만 생각하기 때문에 더 이상 foreach 문을 사용하여 프로그래밍하지 않습니다. 그것은 아주 강력합니다. – OmegaMan

+0

예, 루프는 화면이나 파일 출력과 같은 코드에 부작용이있는 빨판 용입니다. – R0MANARMY

관련 문제