Эффективный способ удаления дубликатов строк из массива строк в C#


Я хотел бы знать эффективный метод удаления дубликатов элементов из строкового массива в 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.
Но мы ищем оптимизированный способ сделать то же самое.

EDIT: я использую .NET 2.0 и VS 2005

4 3

4 ответа:

Вы можете использовать хэш-набор:

string[] a = { "abc", "xyz","abc", "def", "ghi", "asdf", "ghi","xd", "abc" };
var b = new HashSet<string>(a);

Вы не можете изменить размер массива в .NET, поэтому независимо от способа удаления дубликатов, вы должны создать новый массив для результата.

Вы можете использовать HashSet<string>, Чтобы легко удалить дубликаты:

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

Набор хэшей добавит элементы из массива к себе и автоматически отбросит дубликаты. Поскольку набор хэшей использует хэш-коды для проверки существующих элементов, это будет несколько быстрее, чем сортировка элементов, однако результат, конечно, не сортируется.

При использовании .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();
        }
    }
}