2011-01-28 7 views
0

해시 테이블을 사용하여 파일에서 데이터를 읽고 클러스터를 만듭니다. 내 해시 테이블이 작동하지 않습니다.

는 파일의 데이터가 말해 :

umair,i,umair 
sajid,mark,i , k , i 

출력은 같다 :

[{umair,umair},i] 
[sajid,mark,i,i,k] 

하지만 내 코드가 작동하지 않습니다. 해시 테이블에 삽입 할 때 (그리고 그것에서 읽을 때) 대신 record 변수의 foreach를 사용하여 당신은 records 배열로 작업 할

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Collections; 
namespace readstringfromfile 
{ 

    class Program 
    { 
     static void Main() 
     { 
      /* int i = 0; 
      foreach (string line in File.ReadAllLines("newfile.txt")) 
      { 
       string[] parts = line.Split(','); 
       foreach (string part in parts) 
       { 
        Console.WriteLine("{0}:{1}", i,part); 
       } 
       i++; // For demo only 
      }*/ 
      Hashtable hashtable = new Hashtable(); 

      using (StreamReader r = new StreamReader("newfile.txt")) 
      { 
       string line; 
       while ((line = r.ReadLine()) != null) 
       { 
        string[] records = line.Split(','); 
        foreach (string record in records) 
        { 
         if (hashtable[records] == null) 
          hashtable[records] = (int)0; 

         hashtable[records] = (int)hashtable[records] + 1; 
         Console.WriteLine(hashtable.Keys); 

        } 
/////this portion is not working///////////////////////////////////// 

        foreach (DictionaryEntry entry in hashtable) 
        { 
         for (int i = 0; i < (int)hashtable[records]; i++) 
         { 
          Console.WriteLine(entry); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

리터럴 0을 int로 캐스트 할 필요가 없습니다. –

+4

다른 모든 것을 제쳐두고 비 제너릭 컬렉션을 사용하는 이유가 있습니까? –

+0

나는 0을 캐스팅하지 않지만이 섹션은 어떻게됩니까? foreach (해시 테이블의 DictionaryEntry 항목) {for (int i = 0; i <(int) 해시 테이블 [레코드]; i ++) { Console.WriteLine (entry); } } –

답변

2

: 여기에 코드입니다. 또한 최종 모양에서 현재 entry.Key 대신 records을 기반으로 반복합니다. 너무 넓은 범위에서 해시 테이블을 선언하여 모든 행을 행 하나당이 아닌 동일한 해시 테이블에 삽입하도록합니다.

public static void Main() { 
    var lines = new[] { "umair,i,umair", "sajid,mark,i,k,i" }; 
    foreach (var line in lines) { 
     var hashtable = new Hashtable(); 
     var records = line.Split(','); 

     foreach (var record in records) { 
      if (hashtable[record] == null) 
       hashtable[record] = 0; 

      hashtable[record] = (Int32)hashtable[record] + 1; 
     } 

     var str = ""; 
     foreach (DictionaryEntry entry in hashtable) { 
      var count = (Int32)hashtable[entry.Key]; 
      for (var i = 0; i < count; i++) { 
       str += entry.Key; 
       if (i < count - 1) 
        str += ","; 
      } 
      str += ","; 
     } 

     // Remove last comma. 
     str = str.TrimEnd(','); 

     Console.WriteLine(str); 
    } 

    Console.ReadLine(); 
} 

그러나 일반 Dictionary<TKey,TValue> 클래스를 사용하는 것을 고려하고 문자열을 많이 만들고 있어요 경우 StringBuilder를 사용해야합니다.

public static void Main() { 
    var lines = new[] { "umair,i,umair", "sajid,mark,i,k,i" }; 
    foreach (var line in lines) { 
     var dictionary = new Dictionary<String, Int32>(); 
     var records = line.Split(','); 

     foreach (var record in records) { 
      if (!dictionary.ContainsKey(record)) 
       dictionary.Add(record, 1); 
      else 
       dictionary[record]++; 
     } 

     var str = ""; 
     foreach (var entry in dictionary) { 
      for (var i = 0; i < entry.Value; i++) { 
       str += entry.Key; 
       if (i < entry.Value - 1) 
        str += ","; 
      } 
      str += ","; 
     } 

     // Remove last comma. 
     str = str.TrimEnd(','); 

     Console.WriteLine(str); 
    } 

    Console.ReadLine(); 
} 
0

시퀀스의 요소를 그룹화하려고합니다. LINQ에는 기본 제공 연산자가 있습니다. 당신이 짧은 코드를 선호하는 경우

var lines = new[] { "umair,i,umair", "sajid,mark,i,k,i" }; 
foreach (var line in lines) { 
    var groupedRecords = 
     from record in line.Split(',') 
     group record by record into recordgroup 
     from record in recordgroup 
     select record; 

    Console.WriteLine(
     string.Join(
      ",", groupedRecords 
     ) 
    ); 
} 

, 루프가 동등하게 같이 쓸 수 : 그것은 group ... by ... into ... 또는 같은 코드 (I/O 등을 제외한 파일)을 쓸 수 있다는 것을 의미에 해당하는 방법 .GroupBy(...)

로 사용되는 :

foreach (var line in lines) 
    Console.WriteLine(string.Join(",", 
     line.Split(',').GroupBy(rec=>rec).SelectMany(grp=>grp))); 

두 버전을 출력 ...

umair,umair,i 
sajid,mark,i,i,k 

실제로는 Hashtable을 사용하면 안됩니다. 거의 모든 유형의 유형이 안전하지 않은 느린 버전 Dictionary 일뿐입니다. 또한 언급 한 출력 예제에는 []{} 문자가 포함되어 있지만 포함 여부 또는 방법을 지정하지 않았으므로이를 제외 시켰습니다.

LINQ 그룹은 키 (여기서는 문자열)가있는 요소 시퀀스 (여기서는 동일한 문자열)에 지나지 않습니다. 따라서 GroupBy을 호출하면 일련의 레코드가 일련의 그룹으로 변환됩니다. 그러나 이러한 그룹을 연결하기 만하면됩니다. SelectMany은 이러한 연결입니다. 일련의 항목에서 각 항목의 "내용"을 하나의 큰 순서로 연결합니다.

관련 문제