Эффективный способ удалить повторяющиеся строки из массива строк в C # - PullRequest
5 голосов
/ 11 апреля 2011

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

12 голосов
/ 11 апреля 2011

Вы можете использовать HashSet:

string[] a = { "abc", "xyz","abc", "def", "ghi", "asdf", "ghi","xd", "abc" };
var b = new HashSet<string>(a);
7 голосов
/ 11 апреля 2011

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

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

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

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

6 голосов
/ 11 апреля 2011

Если вы используете .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();
        }
    }
}
6 голосов
/ 11 апреля 2011

Взгляните на IEnumerable.Distinct () Метод

...