Удаление повторяющихся строк коллекции в памяти - PullRequest
0 голосов
/ 14 июля 2011

Я работаю над гипотетическим вопросом. Один из них заключается в том, что, если в памяти есть дубликаты коллекций строк, как бы я мог удалить дубликаты при сохранении исходного порядка или коллекций?

Ответы [ 3 ]

1 голос
/ 14 июля 2011

попробуйте что-то вроде этого

        List<String> stringlistone = new List<string>() { "Hello", "Hi" };
        List<String> stringlisttwo = new List<string>() { "Hi", "Bye" };
        IEnumerable<String> distinctList = stringlistone.Concat(stringlisttwo).Distinct(StringComparer.OrdinalIgnoreCase);

        List<List<String>> listofstringlist = new List<List<String>>() { stringlistone, stringlisttwo };
        IEnumerable<String> distinctlistofstringlist = listofstringlist.SelectMany(x => x).Distinct(StringComparer.OrdinalIgnoreCase);

это зависит от того, как вы присоединяетесь к спискам, но должно дать вам представление, добавил порядковый регистр игнорирования на тот случай, если вы хотите, чтобы список предназначений рассматривал «hi» и «Hi» как одно и то же

Вы также можете просто назвать отличное, так что если вы сделали

        List<String> stringlistone = new List<string>() { "Hi", "Hello", "Hi" };

        stringlistone = stringlistone.Distinct(StringComparer.OrdinalIgnoreCase);

stringlistone будет список с stringlistone[0] == "Hi" и stringlistone[1] == "Hello"

0 голосов
/ 14 июля 2011

Скажем, у вас есть List<List<string>>, который вы читаете из файла или базы данных (так что они еще не интернированы), и вы не хотите дублировать строки, вы можете использовать этот код:

public void FoldStrings(List<List<string>> stringCollections)
{
   var interned = new Dictionary<string,string> ();
   foreach (var stringCollection in stringCollections)
   {
      for (int i = 0; i < stringCollection.Count; i++)
      {
         string str = stringCollection[i];
         string s;
         if (interned.TryGetValue (str, out s))
         {
            // We already have an instance of this string.
            stringCollection[i] = s;
         }
         else
         {
            // First time we've seen this string... add to hashtable.
            interned[str]=str;
         }
      }
   }
}
0 голосов
/ 14 июля 2011

Не беспокойся об этом.Framework не создает дублирующую строку в памяти.Все указатели с одинаковыми строковыми значениями указывают на одно и то же место в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...