8

我想知道一种从 C# 中的字符串数组中删除重复项的有效方法。

例如,

string[] a = { "abc", "xyz","abc", "def", "ghi", "asdf", "ghi","xd", "abc" };

会变成,

string[] a = { "abc", "xyz","def", "ghi", "asdf", "xd" };

删除重复条目后如何填补空白?有没有办法在不使用额外的数组来存储元素的情况下做到这一点?

我使用的方法:

1) Sorted the array

2) Replaced the duplicate entries with null

3) Copied NOT null string to a new array.

但是寻找一种优化的方法来做同样的事情。

编辑:我正在使用 .NET 2.0 和 VS 2005

4

4 回答 4

15

您可以使用 HashSet:

string[] a = { "abc", "xyz","abc", "def", "ghi", "asdf", "ghi","xd", "abc" };
var b = new HashSet<string>(a);
于 2011-04-11T07:59:34.927 回答
10

您无法在 .NET 中调整数组的大小,因此无论您使用何种方式删除重复项,都必须为结果创建一个新数组。

您可以使用 aHashSet<string>轻松删除重复项:

a = new HashSet<string>(a).ToArray();

哈希集会将数组中的项目添加到自身,并自动丢弃重复项。由于散列集使用散列码来检查现有项目,这将比对项目进行排序要快一些,但结果当然是未排序的。

于 2011-04-11T08:01:37.657 回答
7

看看IEnumerable.Distinct() 方法

于 2011-04-11T07:59:01.110 回答
6

如果使用 .NET 3.0,您可以使用 LINQ:

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] a = { "abc", "xyz", "abc", "def", "ghi", "asdf", "ghi", "xd", "abc" };
            string[] b = a.Distinct().ToArray();
            foreach (string s in b)
                Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
于 2011-04-11T09:12:17.203 回答