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

时间:2010-01-02 18:17:57

标签: c# .net asp.net twitter

我对C#编程很陌生,而且我被困在我的小ASP.NET项目中。

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

现在我有一个List<String>我可以排序,以便所有重复的网址彼此相邻。我的印象是我可以将list[i]list[i+1]进行比较,如果匹配,则将计数器添加到(count ++),如果它们不匹配,则为URL和要计算要添加到新数组的值,假设这是重复项的结尾。

这将删除重复项,并为我计算每个URL的出现次数。目前,我所拥有的不起作用,我不知道为什么(就像我说的那样,我对这一切都不是很有经验)。

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

我想将每个URL中的一个(没有重复项),一个计数整数(到字符串)用于URL的出现次数,以及用户名,消息和用户图像URL全部放入我的锯齿状数组中,称为“urls” [100] []”。我已经将数组排成100行以确保一切都能够适合但通常,这太大了。每个'行'将包含5个元素。

调试器卡在了一行:if (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

4 个答案:

答案 0 :(得分:8)

您的算法的描述似乎很好。我不知道实施有什么问题;我没有仔细阅读过。 (您使用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);

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您的循环失败,因为当i == 99,(i + 1)== 100时,它超出了数组的范围。

但正如其他人所指出的那样,.Net 3.5可以更优雅地做你想做的事。

答案 3 :(得分:0)

如果您不需要知道特定条目有多少重复项,则可以执行以下操作:

LINQ扩展方法

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