Эффективный способ удаления дубликатов строк из массива строк в 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 ответа:
Вы можете использовать хэш-набор:
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();
Набор хэшей добавит элементы из массива к себе и автоматически отбросит дубликаты. Поскольку набор хэшей использует хэш-коды для проверки существующих элементов, это будет несколько быстрее, чем сортировка элементов, однако результат, конечно, не сортируется.
Взгляните на IEnumerable.Метод Distinct ()
При использовании .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(); } } }