给出以下strings = new string[] { "a", "a", "a", "b", "b", "c", "c", "c", "c", "d" };
如何替换重复项以产生以下输出:{ "a", "Duplicate", "Duplicate", "b", "Duplicate", "c", "Duplicate", "Duplicate", "Duplicate", "d" }
答案 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");