我正在研究一个假设的问题。其中之一是如果内存中有重复的字符串集合,我如何在保持原始顺序或集合的同时删除重复项?
答案 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;
}
}
}
}