Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的哈希表不工作_C#_.net_Hashtable - Fatal编程技术网

C# 我的哈希表不工作

C# 我的哈希表不工作,c#,.net,hashtable,C#,.net,Hashtable,我使用哈希表从文件中读取数据并生成集群 假设文件中的数据为: 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.Coll

我使用哈希表从文件中读取数据并生成集群

假设文件中的数据为:

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);
                        }
                    }
                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用系统集合;
命名空间readstringfromfile
{
班级计划
{
静态void Main()
{
/*int i=0;
foreach(File.ReadAllLines(“newfile.txt”)中的字符串行)
{
string[]parts=line.Split(',');
foreach(部分中的字符串部分)
{
Console.WriteLine(“{0}:{1}”,i,部分);
}
i++;//仅用于演示
}*/
Hashtable Hashtable=新的Hashtable();
使用(StreamReader r=newstreamreader(“newfile.txt”))
{
弦线;
而((line=r.ReadLine())!=null)
{
string[]records=line.Split(',');
foreach(记录中的字符串记录)
{
if(哈希表[记录]==null)
哈希表[记录]=(int)0;
哈希表[记录]=(int)哈希表[记录]+1;
Console.WriteLine(hashtable.Keys);
}
/////这部分不起作用/////////////////////////////////////
foreach(哈希表中的DictionaryEntry条目)
{
对于(int i=0;i<(int)哈希表[记录];i++)
{
控制台写入线(条目);
}
}
}
}
}
}
}

在插入哈希表(以及从哈希表中读取)时,您使用的是
记录
数组,而不是使用foreach变量
记录
。另外,在最后一次查看中,您将基于
记录进行迭代,而不是基于当前的
条目.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();
}
publicstaticvoidmain(){
var lines=new[]{“umair,i,umair”,“sajid,mark,i,k,i”};
foreach(行中的var行){
var hashtable=新的hashtable();
var记录=行分割(',');
foreach(记录中的var记录){
if(哈希表[记录]==null)
哈希表[记录]=0;
哈希表[记录]=(Int32)哈希表[记录]+1;
}
var str=“”;
foreach(哈希表中的DictionaryEntry条目){
var count=(Int32)哈希表[entry.Key];
对于(变量i=0;i

但是,你应该考虑使用泛型类,如果你正在构建很多字符串,使用A。

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();
}
publicstaticvoidmain(){
var lines=new[]{“umair,i,umair”,“sajid,mark,i,k,i”};
foreach(行中的var行){
var dictionary=newdictionary();
var记录=行分割(',');
foreach(记录中的var记录){
如果(!dictionary.ContainsKey(记录))
添加(记录1);
其他的
字典[记录]+;
}
var str=“”;
foreach(字典中的var条目){
对于(变量i=0;i
您正在尝试对序列的元素进行分组。LINQ为此有一个内置的操作符;它被用作
组。。。通过进入…
或等效方法
。GroupBy(…)

这意味着您可以将代码(不包括文件I/O等)编写为:

如果您喜欢较短的代码,循环可以等效地编写为:

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
请注意,您真的不应该使用
哈希表
——这只是
字典
的一个类型不安全的慢版本。另外,您提到的输出示例包括
[]
{}
字符,但是您没有指定如何或是否应该包含这些字符,所以我将它们省略了


LINQ组不过是一系列元素(这里是相同的字符串)和一个键(这里是字符串)。因此,调用
GroupBy
将记录序列转换为组序列。但是,您希望简单地连接这些组
SelectMany
就是这样一种串联:从一个项目序列中,它将每个项目的“内容”串联成一个大序列。

您不需要将文本0转换为整数。将所有其他内容都放在一边,是否有任何原因使您仍在使用非泛型集合?好的,我不会强制转换0,但这一部分如何?foreach(hashtable中的DictionaryEntry条目){for(int i=0;i<(int)hashtable[记录];i++{Console.WriteLine(条目);}}
umair,umair,i
sajid,mark,i,i,k