C#:如果数组不包含字符串,则将字符串添加到数组中

时间:2013-08-16 15:31:25

标签: c#

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

string[] strings = {};

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

uniqueStrings = strings.Distinct.ToArray();

这有效,但它非常慢,因为我必须将字符串变量保存在内存中,这变得非常大。因此,如果字符串在uniqueStrings中,如果不立即添加,我正在寻找一种方法来检查。我怎么能这样做?

7 个答案:

答案 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