【问题标题】:Method to find / eliminate repetitive strings查找/消除重复字符串的方法
【发布时间】:2011-08-14 22:49:39
【问题描述】:

我正在尝试找到一个解决方案,消除重复的字符串名称,例如, 在文字字段中,我正在填充某些文章历史版本的贡献者的名称,因此,如果“ron”对文章的版本控制做出了 3 次贡献,则名称“ron”将添加到此文字控件中,并输出"ron" 3 次。

我试图找到,如果一个名字重复两次,我应该只能填充一次。我怎样才能做到这一点?

【问题讨论】:

  • 一个非常简单的答案是寻找某种集合。集合是只允许一个对象的一个​​实例的数据结构,例如“ron”,在结构中。这样当你需要从集合中提取数据时,“ron”只会出现一次。
  • 不清楚你的源字符串是什么,你的输出是什么。
  • 嗨 p.campbell,我正在使用 ektron 的 api 获取作者的姓名——它是一个 CMS 系统——并在文字控件中填充作者的姓名,遍历内容的版本控制作者。

标签: c# asp.net .net vb.net string


【解决方案1】:

我建议您使用字典,其键将是作者姓名(或您不想重复的字段),值将是贡献者列表。例如,

Dictionary<string, List<Contributor>> contributors 
           = new Dictionary<string, List<Contributor>>();


Contributor contributor = new Contributor("ron", /*other values*/);
if ( !contributors.ContainsKey(contributor.Name) )
     contributors.Add(contributor.Name,new List<Contributor>());

contributors[contributor.Name].Add(contributor);

【讨论】:

  • 我不确定,我可以让它工作,因为我正在使用 ektron api 调用拉出作者列表......但会尝试。感谢@Nawaz 的建议
【解决方案2】:

根据您的设置,我会使用 StringCollection 并在插入之前检查名称是否存在,或者只是将所有名称添加到 List 并调用 Distinct()(System.Linq 中的扩展方法)。所以要么:

StringCollection Names=new StringCollection();
if(!Names.Contains(Name))
   Names.Add(Name);

正如 CharithJ 建议的那样,或者:

List<string> Names=new List<string>();
Names.Add(Name);
...
foreach(string Name in Names.Distinct())
{
...
}

任何一个都可以很好地工作。

【讨论】:

    【解决方案3】:

    使用 C#s .Contains() 函数检查名称是否已添加到字符串中

    【讨论】:

      【解决方案4】:

      创建一个您想要实现的模型(它就像一个视图模型)来驱动您的“报告”的呈现。那么,模型就可以控制“每个名字只输出一次”这个需求。伪代码如下:

      var ron = new Author("ron");
      var ronnie = new Author("ronnie");
      var report = new HistoryReport();
      report.AddVersion(1, ron);
      report.AddVersion(2, ron);
      report.AddVersion(3, ronnie);
      string renderedReport = report.Render();
      // output e.g.: 
      //   Versions 1 and 2 by ron; Version 3 by ronnie
      

      然后您使用该输出来填充您的文字控件。

      如果您使用简单的字符串替换,您会将ronronnie 混淆。

      【讨论】:

        【解决方案5】:
        StringCollection authors= new StringCollection();
        
        if (!authors.Contains("Ron"))
        {
            authors.Add("Ron");
        }
        

        【讨论】:

        • 如果列表中包含多个项目,则列表不适合查找。 Hashset 或 Dictionary 是适用于一百万或一百万用户的数据结构,速度同样快。列表则相反。
        • @Alois:感谢您的反对。问题是说作者很少吗?听起来有超过 10 个项目可以成为 StringCollection 的候选对象。
        • @CharithJ:是的,我正在使用 ektron 的 api 调用提取贡献者的姓名,其中,对于一个内容,可能有 1 个作者(贡献者)或多个可以编辑内容的贡献者,或者同一作者,谁可以对其进行多次编辑和版本化。这就是我要删除的部分,如果它有多次相同的作者。
        • @Ron:应该可以这样用吧。
        猜你喜欢
        • 2011-11-22
        • 2020-05-23
        • 2016-10-05
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多