我有很多字符串数组。从所有这些字符串数组中,我想创建一个唯一字符串数组。目前我这样做:
string[] strings = {};
while(running)
{
newStringArrayToAdd[] = GetStrings();
strings = strings.Concat(newStringArrayToAdd).ToArray();
}
uniqueStrings = strings.Distinct.ToArray();
这有效,但它非常慢,因为我必须将字符串变量保存在内存中,这变得非常大。因此,如果字符串在uniqueStrings中,如果不立即添加,我正在寻找一种方法来检查。我怎么能这样做?
答案 0 :(得分:9)
考虑使用HashSet<string>
而不是数组。如果字符串已经存在于集合中,它将不执行任何操作:
HashSet<string> strings = new HashSet<string>();
strings.Add("foo");
strings.Add("foo");
strings.Count // 1
UnionWith
方法在您的示例代码中非常有用:
HashSet<string> strings = new HashSet<string>();
while(running)
{
string[] newStringArrayToAdd = GetStrings();
strings.UnionWith(newStringArrayToAdd);
}
答案 1 :(得分:2)
请改用HashSet。像这样:
HashSet<string> uniqueStrings = new HashSet<string>();
for loop...
if (!uniqueStrings.Contains(newStringToAdd))
{
uniqueStrings.Add(newStringToAdd);
}
之后获取数组:
var uniqueStringArray = uniqueStrings.ToArray();
答案 2 :(得分:1)
你能保留字符串哈希的列表吗?
添加新字符串时,如果其列表中的哈希值尚未存在,则表示它是唯一的。
如果哈希存在,可能是唯一的,或者它可能是哈希冲突,所以你必须检查很长的路。但这应该是一个相对罕见的案例。
答案 3 :(得分:1)
您可以使用Union
string[] result = strings.Union(strings2).ToArray();
因此将代码更改为
string[] strings = {};
while(running)
{
newStringArrayToAdd[] = GetStrings();
strings = strings.Union(newStringArrayToAdd).ToArray();
}
// No need for this line as strings will be unique
//uniqueStrings = strings.Distinct.ToArray();
根据msdn
此方法从返回集中排除重复项。这是Concat方法的不同行为,它返回输入序列中的所有元素,包括重复项。
答案 4 :(得分:1)
您可以使用将为您进行过滤的Hashset
:
HashSet<string> strings = new HashSet<string>();
for loop....
foreach (string s in newStringArrayToAdd)
strings.Add(s);
end of loop:
uniqueStrings = strings.ToArray();
答案 5 :(得分:0)
使用HashSet<string>
。以下是有关列表如何工作的更多信息:http://msdn.microsoft.com/en-us/library/bb359438.aspx
答案 6 :(得分:0)
您是否考虑过将字符串存储在HashSet而不是数组中?每次添加时,hashset都会保证在恒定时间内保持唯一性。
var strings = new HashSet<string>();
strings.Add("abc");
strings.Add("abc");
strings.Count // is 1