Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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_Asp.net_Twitter - Fatal编程技术网

C# 计算数组中字符串的出现次数,然后删除重复项

C# 计算数组中字符串的出现次数,然后删除重复项,c#,.net,asp.net,twitter,C#,.net,Asp.net,Twitter,我对C语言编程相当陌生,我被困在我的小ASP.NET项目中 我的网站目前正在检查Twitter的URL状态,然后通过正则表达式模式匹配过程将这些URL添加到数组中。很明显,不止一个人会用一个特定的URL更新一个URL,所以我不想列出重复的URL,我想计算一个特定URL在100条推文中被提及的次数 现在我有一个列表,我可以排序,以便所有重复的URL都彼此相邻。我的印象是,我可以比较list[I]和list[I+1],如果它们匹配,计数器将添加到count++,如果它们不匹配,则URL和计数值将添加

我对C语言编程相当陌生,我被困在我的小ASP.NET项目中

我的网站目前正在检查Twitter的URL状态,然后通过正则表达式模式匹配过程将这些URL添加到数组中。很明显,不止一个人会用一个特定的URL更新一个URL,所以我不想列出重复的URL,我想计算一个特定URL在100条推文中被提及的次数

现在我有一个列表,我可以排序,以便所有重复的URL都彼此相邻。我的印象是,我可以比较list[I]和list[I+1],如果它们匹配,计数器将添加到count++,如果它们不匹配,则URL和计数值将添加到新数组,假设这是重复的结束

这将删除重复项,并为每个URL提供出现次数的计数。目前,我所拥有的一切都不起作用,我不知道为什么,正如我所说,我对这一切都不是很有经验

在下面的代码中,假设已在srchResponse.results中使用关键字搜索JSON提要。包含URL的结果被添加到sList,这是一种字符串列表类型,它只包含URL,而不包含整个消息

我想将每个URL中的一个放入名为“URL[100][]”的锯齿状数组中,不重复,一个计数整数作为URL出现次数的字符串,以及用户名、消息和用户图像URL。我已经将数组设置为100行长,以确保所有内容都适合,但一般来说,这太大了。每个“行”将包含5个元素

调试器陷入了困境:如果sList[i]==sList[i+1]是我想法的关键,那么很明显,逻辑不起作用。如有任何建议或任何事情,我们将不胜感激

以下是示例代码:

  var sList = new ArrayList();

    string[][] urls = new string[100][];

    int ctr = 0;
    int j = 1;

    foreach (Result res in srchResponse.results)
    {           

        string content = res.text;
        string pattern = @"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)";
        MatchCollection matches = Regex.Matches(content, pattern);

      foreach (Match match in matches)
      {

        GroupCollection groups = match.Groups;

                    sList.Add(groups[0].Value.ToString());
      }
    }

    sList.Sort();    
    foreach (Result res in srchResponse.results)
    {
        for (int i = 0; i < 100; i++)
        {
            if (sList[i] == sList[i + 1])
            {
                j++;
            }
            else
            {
                urls[ctr][0] = sList[i].ToString();
                urls[ctr][1] = j.ToString();
                urls[ctr][2] = res.text;
                urls[ctr][3] = res.from_user;
                urls[ctr][4] = res.profile_image_url;
                ctr++;
                j = 1;
            }
        }



    }
然后,代码继续使用HTML将每个结果添加到StringBuilder方法中


现在是edite

我建议使用比数组更复杂的数据结构。一套将保证你没有重复的


看起来C集合不包含集合,但有第三方实现可用,例如。

对算法的描述似乎很好。我不知道实施有什么问题;我没有仔细读过。您正在使用ArrayList这一事实是一个直接的危险信号;为什么不使用更强类型的泛型集合

不过,我有一个建议。这正是LINQ想要解决的问题。与其自己编写所有容易出错的代码,不如描述一下您感兴趣的转换,让编译器为您解决

假设您有一个字符串列表,并且希望确定每个字符串的出现次数:

var notes = new []{ "Do", "Fa", "La", "So", "Mi", "Do", "Re" };

var counts = from note in notes 
             group note by note into g
             select new { Note = g.Key, Count = g.Count() }

foreach(var count in counts)
    Console.WriteLine("Note {0} occurs {1} times.", count.Note, count.Count);

我希望您同意,这比您编写的所有数组逻辑都更容易阅读。当然,现在你有了你独特的物品序列;您有一个计数序列,每个计数都包含一个唯一的注释。

循环失败,因为当i==99时,i+1==100超出了数组的边界


但正如其他人所指出的,.Net 3.5可以更优雅地实现您想要的功能。

如果您不需要知道某个特定条目有多少个副本,可以执行以下操作:

LINQ扩展方法

.Count()   
.Distinct()  
.Count()  

您是否能够使用LINQ,即您是否可以使用框架的3.0版本?它可以在大约一行代码中完全满足您的要求:我使用的是3.5框架。。。你能给我一个实现LINQ的例子,或者我可以在哪里找到更多的例子吗?很好的例子:-更具体到这个例子:你的第三段在语法上没有意义。是的,对不起,我弄乱了数组和列表。。。我正在使用一个列表进行比较,并将其放入一个数组中。。。数组和列表是相当可互换的。。。我希望数组具有列表的方法和功能!消息更新@duffymo-有一个集合结构,叫做HashSet,它是在.NET3.5中引入的。他们无法将其称为Set,因为这可能与Visual Basic中的Set关键字冲突。谢谢,John。命名空间不能解决这个问题吗?我以为这就是为什么。是否也有树集或任何其他实现?@duffymo-In VB Set是一个关键字,就像for或,如果是这样,名称空间的更改将不会有帮助。我相信在这一点上没有其他的实现,因为集合没有接口,但是结构本身没有密封,所以可能会有更多。看起来好像在.NET 4.0中,他们正在创建一个ISet接口,该接口将允许其他实现。感谢您的指导,John。非常有趣和有用。。。林克:我意识到现在是我解决这个问题的办法。什么是更强类型的泛型集合?你是说我自己定义的一个集合,一个使用内部属性进行比较的对象集合?阿盖
n谢谢Eric,好东西。看起来我错过了其他答案发布的通知。我将删除我的,以代替此响应…@AlexW-在本例中,列表将是您所需的强类型泛型集合,因为URL列表将显式包含字符串,并且仅包含字符串。显然,泛型的内容比这多,但这是一个简单的解释。Add接受对象类型,对象类型可以是从对象继承的任何内容,而对象恰好是.NET!中的所有内容!。很好的教程:我确实尝试过使用较低的值,例如I<40,但仍然不起作用!然后发生的事情是,它说URL[ctr][1]=j.ToString;出现错误:空引用异常。。。???我还是很困惑!我将尝试使用LINQ并重新编写整个内容。如果我重写ToString方法,这将适用于我的整数j=1;