在Vb.Net中,如何删除重复项但在列表中至少留下一个重复项?

时间:2012-03-27 14:53:29

标签: .net vb.net arrays list items

我有一个List对象,我想删除重复的项目,但在列表中至少留下一个重复的项目;

我写了类似这样的东西但是我会优化这段代码以获得更好的性能,还有更快的东西吗?

Const chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Dim rnd As New Random()
Dim mylist As List(Of String) = Enumerable.Range(1, 100).Select(Function(i) chars(rnd.Next(0, chars.Length)).ToString).ToList

For n As Integer = mylist.Count - 1 To n = 0 Step -1

    'remove the item if it's duplicated
    'but leave at least one of the duplicated items in the list
    If mylist.IndexOf(mylist.Item(n), 0) < n Then
        mylist.RemoveAt(n)
    End If

Next

3 个答案:

答案 0 :(得分:6)

您是否尝试过.Distinct()

Dim stringWithChars As String = "AABBCCDDEEFFaabbccddeeff"
Dim res = stringWithChars.Distinct() // ABCDEFabcdef

编辑:由于您没有说明您使用的是哪个框架,我认为您可以使用Linq(.NET 3.5 +)

答案 1 :(得分:2)

我不确定Distinct是否像Alex建议的那样对字符串起作用,但另一种解决方案是在调用Distinct之前将字符串转换为char数组。这是一个例子:

var test = "abcdefggabc";

test = new string(test.ToCharArray().Distinct().ToArray());

编辑:Alex在字符串上对此进行了测试,但是它可以正常工作,因此任何一种解决方案都可以正常运行。

如果您正在寻找LINQ的替代方案,那么您也应该能够使用正则表达式来实现这一目标。这样的事情可能有用:

var test = Regex.Replace("JJJJJ DDDD KK  YYYYY", @"(.)(\1)+", "$1");

答案 2 :(得分:1)

您可以使用HashSet代替列表吗?