代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  0
  • Alex  · 技术社区  · 16 年前

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

    现在我有一个 List<String> 我可以对其进行排序,以便所有重复的URL彼此相邻。我的印象是我可以比较 list[i] 具有 list[i+1]

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

    在下面的代码中,假设已使用关键字搜索JSON提要 srchResponse.results . 将包含URL的结果添加到 sList

    我想将每个URL中的一个(无重复)、URL出现次数的计数整数(到字符串)以及用户名、消息和用户图像URL全部放入名为“URL[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;
                }
            }
    
    
    
        }
    

    现在是伊迪特

    4 回复  |  直到 16 年前
        1
  •  8
  •   Eric Lippert    16 年前

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

    描述您感兴趣的转换 编译程序

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

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

        2
  •  1
  •   duffymo    16 年前

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

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

        3
  •  0
  •   Matt Ellen Bipin Vayalu    16 年前

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

    但正如其他人所指出的,.NET3.5可以更优雅地完成您想要的任务。

        4
  •  0
  •   citronas    16 年前

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