c# - 如何使用 LINQ 重命名列表中的重复项

标签 c# linq

我需要一个唯一值列表。但它可能是,值在列表中存在两次或更多次。 如果发生这种情况,我必须重命名该值,但重命名的值也可能在列表中。

可以使用 LINQ 查询重命名值,这样我就不需要子查询了吗?

示例 1: 之前: “一”、“一”、“二”、“二”、“三” 之后: “一”、“一_”、“二”、“二_”、“三”

示例 2: 之前: “一一一_” 之后: “一个”,“一个_”,“一个__”

第三个“one”有2个下划线,因为第二个“one”被重命名为“one_”。

非常感谢你的想法...

最佳答案

我不认为这应该通过简单的 linq 查询来完成。如果我是你,我会使用 HashSet 并创建一个函数。像这样:

IEnumerable<String> GetUnique(IEnumerable<String> list) {
    HashSet<String> itms = new HashSet<String>();
    foreach(string itm in list) {
         string itr = itm;
         while(itms.Contains(itr)) {
             itr = itr + "_";
         }
         itms.Add(itr);
         yield return itr;
    }
}

[编辑]

虽然这可以做成一个扩展方法,所以你可以这样调用它:myList.GetUnique();(或类似的东西)

[编辑2]

修复了迭代器变量被更改的错误。

关于c# - 如何使用 LINQ 重命名列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7163467/

相关文章:

c# - 如何使用 await/async 等待资源

c# - 为什么 WebBrowser.Navigate 返回 null HttpDocument?

c# - 如何过滤 IQueryable<T> 的嵌套项?

c# - LINQ 从第一个列表中选择

c# - 在 C# 中比较两个 csv 文件

c# - 如何用另一个文件中的字符替换一个文件中的字符

c# - 使用tasks和ContinueWith来实现调度器

c# - 如果存在于另一个列表中则设置属性

c# - LINQ 的嵌套组

c# - MySQL Linq 使用 .Contains(变量)