2013-07-30 2 views
0

코드 : 모두 표시 값 위의날짜에 arraylist를 정렬하는 방법?

while ((linevalue = filereader.ReadLine()) != null) 
{ 
     items.Add(linevalue); 
} 
filereader.Close(); 
items.Sort(); 
//To display the content of array (sorted) 
IEnumerator myEnumerator = items.GetEnumerator(); 
while (myEnumerator.MoveNext()) 
{ 
    Console.WriteLine(myEnumerator.Current); 
} 

프로그램. 날짜 만 추출하고 오름차순으로 정렬하는 방법?


나는 LINQ 작업을 제외하고 또는 스레딩이나 다른 물건을 사용하지입니다. 나는 파일 스트림을 고수해야하고, 텍스트 파일에서 데이터를 가져 와서 정렬하고 저장해야한다. 그래서 그것을 검색하고 그것을보고 편집 할 수 있으며 특정 날짜를 검색하고 레코드를 합친 날짜를 볼 수있다. 그 날짜에. 알아낼 수 없다. 고생 중

+4

왜 오늘날에는 모든 arraylist를 사용합니까? 'File [? readAllLines'] 대신'String []'을 반환하는 것이 어떨까요? 더 좋게는'CustomClass'가 위의 속성을 가지고있는'List '를 적재하십시오. –

+0

텍스트 파일의 "열"이 구분되어 있습니까 (예 : 탭)? –

+1

또한 열거자를 직접 사용하지 마시고 foreach를 대신 사용하십시오 :'foreach (items in items) Console.WriteLine (item);' – digEmAll

답변

0

왜 날짜를 검색해야하는지 잘 모르겠습니다. 먼저 튜플에 데이터를 읽는 것이 더 나을 것입니다. 예 :

List<Tuple<string, int, string, DateTime>> items. 

그런 다음 항목별로 정렬 할 수 있습니다. 항목 4는 날짜입니다.

0

시도하고 텍스트 행으로 파일 작동하지 않습니다, 원하는 파일에서 배열의 값 ... 기본적으로

public class DateComparer : IComparer { 
    public int Compare(DateTime x, DateTime y) { 
    if(x.Date > y.Date) 
     return 1; 
    if(x.Date < y.Date) 
     return -1; 
    else 
     return 0; 
    } 
} 
list.Sort(new DateComparer()); 
+0

당신은 비교자가 잘못되었음을 알고 있습니까? 그것은 3 개의 모든 경우를 처리 할 필요가 있습니다 - 게다가'return x.CompareTo (y);'또는'return y.CompareTo (x); '는 더 건강 할 것이다. 그 코드 *는'DateTime'을 가지고 있지 않다. * –

4

를 얻을; 이 코드를 분리하여 코드 이 입력 된 레코드로 텍스트를 구문 분석 한 다음 유형이 지정된 데이터 만 처리해야하는 경우 업스트림을 처리합니다.

예를 들어 (여기서는 파일이 탭으로 구분되어 있다고 가정하고 있지만 쉽게 색인 생성 된 열로 변경할 수 있습니다.); .NET 2.0 (및 아마에서 작동 버전 (아주 우아하지만, 작동하지 않는)을

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
static class Program 
{ 
    static void Main() 
    { 
     foreach (var item in ReadFile("my.txt").OrderBy(x => x.Joined)) 
     { 
      Console.WriteLine(item.Names); 
     } 
    } 
    static readonly char[] tab = { '\t' }; 
    class Foo 
    { 
     public string Names { get; set; } 
     public int Age { get; set; } 
     public string Designation { get; set; } 
     public DateTime Joined { get; set; } 
    } 
    static IEnumerable<Foo> ReadFile(string path) 
    { 
     using (var reader = File.OpenText(path)) 
     { 
      // skip the first line (headers), or exit 
      if (reader.ReadLine() == null) yield break; 

      // read each line 
      string line; 
      var culture = CultureInfo.InvariantCulture; 
      while ((line = reader.ReadLine()) != null) 
      { 
       var parts = line.Split(tab); 
       yield return new Foo 
       { 
        Names = parts[0], 
        Age = int.Parse(parts[1], culture), 
        Designation = parts[2], 
        Joined = DateTime.Parse(parts[3], culture) 
       }; 
      } 
     } 
    } 
} 

을 그리고 여기 : 어떻게 약간의 작업을보고Main 방법은 데이터로 작업 할 필요 .NET 1.1)에서만 ISO-1 언어 기능을 사용합니다. 개인적으로 .NET 1.1을 사용하는 것은 어리석은 일이며 .NET 2.0을 사용하는 경우 List<T>ArrayList보다 훨씬 더 좋습니다.

using System; 
using System.Collections; 
using System.Globalization; 
using System.IO; 
class Program 
{ 
    static void Main() 
    { 
     ArrayList items = ReadFile("my.txt"); 
     items.Sort(FooByDateComparer.Default); 
     foreach (Foo item in items) 
     { 
      Console.WriteLine(item.Names); 
     } 
    } 
    class FooByDateComparer : IComparer 
    { 
     public static readonly FooByDateComparer Default 
      = new FooByDateComparer(); 
     private FooByDateComparer() { } 
     public int Compare(object x, object y) 
     { 
      return ((Foo)x).Joined.CompareTo(((Foo)y).Joined); 
     } 
    } 

    static readonly char[] tab = { '\t' }; 
    class Foo 
    { 
     private string names, designation; 
     private int age; 
     private DateTime joined; 
     public string Names { get { return names; } set { names = value; } } 
     public int Age { get { return age; } set { age = value; } } 
     public string Designation { get { return designation; } set { designation = value; } } 
     public DateTime Joined { get { return joined; } set { joined = value; } } 
    } 
    static ArrayList ReadFile(string path) 
    { 
     ArrayList items = new ArrayList(); 
     using (StreamReader reader = File.OpenText(path)) 
     { 
      // skip the first line (headers), or exit 
      if (reader.ReadLine() == null) return items; 

      // read each line 
      string line; 
      CultureInfo culture = CultureInfo.InvariantCulture; 
      while ((line = reader.ReadLine()) != null) 
      { 
       string[] parts = line.Split(tab); 
       Foo foo = new Foo(); 
       foo.Names = parts[0]; 
       foo.Age = int.Parse(parts[1], culture); 
       foo.Designation = parts[2]; 
       foo.Joined = DateTime.Parse(parts[3], culture); 
       items.Add(foo); 
      } 
     } 
     return items; 
    } 
} 
+0

public string Names {get; 세트; } public int Age {get; 세트; } 공용 문자열 지정 {get; 세트; } 공개 날짜 시간 {get; 세트; } –

+0

@ 마틴 사너 ... 네? –

+0

get 및 set 메서드가 extern 또는 abstract로 표시되지 않으므로 본문을 선언해야한다는 오류가 발생합니다. –

0

당신은 LINQ를 사용하고 단지 날짜 변환을 통해 날짜와 순서를 검색하는 탭에 따라 라인을 분할 할 수 있습니다 :하지만이는 "최악의 경우"입니다.

while ((linevalue = filereader.ReadLine()) != null) 
    { 
      items.Add(linevalue.Split('\t').Last()); 
    } 
    filereader.Close(); 
    items.OrderBy(i => DateTime.Parse(i)); 
    foreach(var item in items) 
    { 
     Console.WriteLine(item); 
    } 
+0

공용 문자열 Names {get; 세트; } public int Age {get; 세트; } 공용 문자열 지정 {get; 세트; } 공개 날짜 시간 {get; 세트; } get 및 set 메소드가 abstract 또는 extern으로 표시되어 있지 않음을 선언해야 함을 나타내는데 계속해서 이것이 작동하지 않는다. –

+0

@MartinSahner 나는 내 게시물을 의도 한 것으로 의심한다. ** 매우 오래된 버전의 C#을 사용하고 있음을 나타냅니다 - 사용중인 Visual Studio 버전이 무엇입니까? 그러면 적절한 대답을 줄 수 있습니까? –

관련 문제