2011-01-28 14 views
0

私はハッシュテーブルを使ってファイルからデータを読み込み、クラスタを作成しています。 私のハッシュテーブルdoes not work

は、ファイル内のデータがあると言う:

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

oki私は0をキャストしませんが、このセクションはどうですか? foreach(ハッシュテーブルのDictionaryEntryエントリ) { for(int i = 0; i <(int)ハッシュテーブル[レコード]; i ++) { Console.WriteLine(entry); } } –

答えて

2

:ここでは、コードです。また、最終的な外観では、entry.Keyの代わりにrecordsに基づいて反復処理を行います。また、ハッシュテーブルを広範囲に宣言しているため、行ごとに1つではなく、すべての行が同じハッシュテーブルに挿入されます。

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 
     ) 
    ); 
} 

:次のように(ファイルI/Oなどを除く)あなたのコードを書くことができることを意味しgroup ... by ... into ...または同等の方法.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グループは、Key(ここでは文字列)を持つ要素のシーケンス(ここでは同一の文字列)にすぎません。したがって、GroupByを呼び出すと、一連のレコードが一連のグループに変換されます。ただし、これらのグループを連結するだけです。 SelectManyはそのような連結です:一連のアイテムから、各アイテムの "内容"を1つの大きなシーケンスに連結します。