替换字符串数组中的重复项

时间:2016-06-01 08:51:53

标签: c# linq

给出以下strings = new string[] { "a", "a", "a", "b", "b", "c", "c", "c", "c", "d" };

如何替换重复项以产生以下输出:{ "a", "Duplicate", "Duplicate", "b", "Duplicate", "c", "Duplicate", "Duplicate", "Duplicate", "d" }

5 个答案:

答案 0 :(得分:7)

对于这样的事情,特别是如果你打算修改数组而不是产生一个新的序列,我宁愿一个老式的循环。在我看来,它更明显,更“聪明”,更容易理解。如果你有类似的看法,循环很容易写。创建一个包含不同项目的集合,并替换已添加到集合中的项目。

var set = new HashSet<string>();
for (int i = 0; i < strings.Length; i++)
{
    if (set.Contains(strings[i]))
    {
        strings[i] = "Duplicate";
    }
    else
    {
        set.Add(strings[i]);
    }
}

根据您的输入,您的输出将是:

a
Duplicate
Duplicate
b
Duplicate
c
Duplicate
Duplicate
Duplicate
d

答案 1 :(得分:4)

使用Linq,您可以执行此操作。

s = s.GroupBy(x=>x)
     .SelectMany(x=>x.Take(1)                                    // Take first element
                     .Concat(x.Skip(1).Select(r=>"Duplicate"))   // Replace other elements with 'Duplicate' 
                )
    .ToArray(); 

检查工作example

答案 2 :(得分:2)

如果您正在搜索仅标记连续重复项的方法:

var strings = new string[] { "a", "a", "a", "b", "b", "c", "c", "c", "c", "d" };
var output = new string[strings.Length];
output[0] = strings[0];

for(int i = 1; i < strings.Length; i++)
{
    output[i] = strings[i] != strings[i - 1] ? strings[i] : "duplicate";
}

答案 3 :(得分:0)

试试这个

strings = new string[] { "a", "a", "a", "b", "b", "c", "c", "c", "c", "d" };
var myArray = new System.Collections.ArrayList();

foreach(var item in strings){
    if (!myArray.Contains(item))
        myArray.Add(item);
    else
        myArray.Add('Duplicate');
}

答案 4 :(得分:0)

只是想为这个

编写一个lambda表达式
var output = strings.ToList().Select((x, y) => Array.IndexOf(strings, x) == y ? x : "Duplicate");