2

我有很多字符串数组。从所有这些字符串数组中,我想创建一个唯一字符串数组。目前我这样做:

string[] strings = {};

while(running)
{
   newStringArrayToAdd[] = GetStrings();
   strings = strings.Concat(newStringArrayToAdd).ToArray();
}

uniqueStrings = strings.Distinct.ToArray();

这行得通,但速度非常慢,因为我必须将字符串变量保存在内存中,这会变得非常大。因此,我正在寻找一种方法来动态检查字符串是否在 uniqueStrings 中,如果不立即添加。我怎样才能做到这一点?

4

7 回答 7

12

考虑使用 aHashSet<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);
}
于 2013-08-16T15:34:55.503 回答
2

请改用HashSet。像这样:

HashSet<string> uniqueStrings = new HashSet<string>();

for loop...
if (!uniqueStrings.Contains(newStringToAdd))
{
  uniqueStrings.Add(newStringToAdd);
}

之后获取数组:

var uniqueStringArray = uniqueStrings.ToArray();
于 2013-08-16T15:34:53.923 回答
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 方法的行为不同,后者返回输入序列中的所有元素,包括重复项。

于 2013-08-16T15:35:25.537 回答
1

您可以使用Hashset将为您进行过滤的 a:

HashSet<string> strings = new HashSet<string>();

for loop....
  foreach (string s in newStringArrayToAdd)
    strings.Add(s);
end of loop:

uniqueStrings = strings.ToArray();
于 2013-08-16T15:35:35.633 回答
1

你能保留一个字符串的哈希列表吗?

当添加一个新字符串时,如果它的哈希值不在列表中,你就知道它是唯一的。

如果散列存在,它可能是唯一的,或者它可能是散列冲突,所以你必须检查很长的路要走。但这应该是一个相对罕见的情况。

于 2013-08-16T15:33:44.467 回答
0

您是否考虑过将字符串存储在 HashSet 而不是数组中?每次添加时,哈希集都会保证在恒定时间内的唯一性。

var strings = new HashSet<string>();
strings.Add("abc");
strings.Add("abc");
strings.Count // is 1
于 2013-08-16T15:35:31.133 回答
0

使用HashSet<string>. 以下是有关列表如何工作的更多信息:http: //msdn.microsoft.com/en-us/library/bb359438.aspx

于 2013-08-16T15:34:07.070 回答