[英]My hashtable doesnt work
我正在使用哈希表從文件中讀取數據並制作集群。
說文件中的數據是:
umair,i,umair
sajid,mark,i , k , i
輸出如下:
[{umair,umair},i]
[sajid,mark,i,i,k]
但我的代碼不起作用。 這是代碼:
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);
}
}
}
}
}
}
}
在插入哈希表(以及從中讀取時)而不是使用foreach-variable record
時,您正在使用records
數組。 此外,在最后看,您基於records
而不是當前entry.Key
進行迭代。 您還在范圍太寬的情況下聲明哈希表,導致所有行都插入到相同的哈希表中,而不是每行一個。
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();
}
您正在嘗試對序列的元素進行分組。 LINQ有一個內置的運算符。 用作group ... by ... into ...
或等效方法.GroupBy(...)
這意味着您可以將代碼(不包括文件I / O等)編寫為:
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
)
);
}
如果您喜歡較短的代碼,則將循環等效地編寫為:
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
是這樣的連接:從一系列項目中,它將每個項目的“內容”連接成一個大的序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.