删除内存中的重复集合字符串

时间:2011-07-14 12:30:13

标签: c# asp.net collections

我正在研究一个假设的问题。其中之一是如果内存中有重复的字符串集合,我如何在保持原始顺序或集合的同时删除重复项?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情

        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);

它取决于你如何加入列表,但是它应该给你一个想法,添加了序数忽略的情况,以防你希望destinct列表将“hi”和“Hi”视为相同的

如果你做了

,你也可以调用不同的
        List<String> stringlistone = new List<string>() { "Hi", "Hello", "Hi" };

        stringlistone = stringlistone.Distinct(StringComparer.OrdinalIgnoreCase);

stringlistone将是一个包含stringlistone[0] == "Hi"stringlistone[1] == "Hello"

的列表

答案 1 :(得分:0)

不要担心。 Framework不会在内存中创建重复的字符串。具有相同字符串值的所有指针都指向内存中的相同位置。

答案 2 :(得分:0)

假设您从文件或数据库中读取了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;
         }
      }
   }
}