2017-02-08 3 views
1

Моя забота заключается в добавлении строки в массив строки, но я хотел убедиться, что эта строка уникальна, прежде чем вставлять ее в массив. Я искал и нашел много подходов для этого, но моя задача сделать быстрее, чем проверка всех элементов массива для дубликата, прежде чем добавить строку, поэтому я решил сделать следующее:Добавление уникальной строки в массив строк в C#

  1. Получить строку (URL из URL Mining Проект, который может возвращать тысячи URL-адресов и иногда может дублироваться, как указано в перекрестке).
  2. Получите ASCII для всех символов в URL-адресе и добавьте их, умноженные на индекс символа (это должен сделать уникальный идентификатор для каждого URL-адреса).
  3. Это значение в точке 2 будет индекс в массиве, чтобы вставить этот URL в.
  4. Проблема сейчас, этот массив должен быть динамическим (Как изменить его размер в зависимости от количества URLS я добыча?) ,
  5. Массив будет пористым (означает массив со многими нулями), есть ли эффективный способ получить ячейки, у которых есть только значения?
  6. Ниже код используется для получения позиции для уникальной строки.
int index = 1; 
int position = 0; 
string s = Console.ReadLine(); 
byte[] ASCIIValues = Encoding.ASCII.GetBytes(s); 

foreach(byte b in ASCIIValues) 
{ 
    position += b * index; 
    index++; 
    Console.WriteLine(b); 
} 
+2

Почему бы не использовать список ('Список ')? Вы всегда можете проверить, есть ли 'list.Contains (value)'. Или '.Add (значение)'. –

+5

Попробуйте ['HashSet '] (https://msdn.microsoft.com/en-us/library/bb359438 (v = vs.110) .aspx # Примеры) –

+0

или просто используйте хэш-алгоритм (SHA256) и вставьте это в словарь. вы можете проверить, что тот же хеш уже существует или нет, прежде чем вставлять. – Thangadurai

ответ

2

Как уже упоминалось в комментариях HashSet будет коллекция использовать для этого случая. Он представляет собой (уникальный) набор значений и имеет O (1) поиск. Итак, вы просто зациклируете строки, которые хотите вставить, и добавьте их в набор. Если строка уже там, она не будет добавлена ​​снова.

var set = new HashSet<string>(); 
foreach(var s in strings) 
    set.Add(s); 
+0

Спасибо Magnus , Я оптимизировал свой код с hashset очень хорошо и отлично работал до сих пор, хотя я еще не тестировал его на огромном количестве элементов, – kingbode

0

Я использовал словарь и удалось решить это ..please проверить свой код в ссылке ниже

Hashset handling to avoid stuck in loop during iteration

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

ниже код Я нашел его где-то и отлично работает и в ссылке выше Я использовал итерацию, чтобы добавить удаление во время итерации.

public static void Add2Dic(IDictionary firstDict, IDictionary secondDict, bool bReplaceIfExists) 
    { 
     foreach (object key in firstDict.Keys) 
     { 
      if (!secondDict.Contains(key)) 
       secondDict.Add(key, firstDict[key]); 
      else if (bReplaceIfExists) 
       secondDict[key] = firstDict[key]; 
     } 
    } 
Смежные вопросы