簡體   English   中英

C#:如果數組不包含字符串,則將字符串添加到數組

[英]C#: Add strings to an array if the array does not contain the string

我有很多字符串數組。 我想從所有這些字符串數組中創建一個唯一字符串數組。 目前,我這樣做是這樣的:

string[] strings = {};

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

uniqueStrings = strings.Distinct.ToArray();

這可以工作,但是它非常慢,因為我必須將字符串變量保留在內存中,這會變得非常巨大。 因此,我正在尋找一種動態檢查字符串是否在uniqueStrings中的方法,以及是否不立即添加它的方法。 我怎樣才能做到這一點?

考慮使用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);
}

請改用HashSet 像這樣:

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

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

之后獲取數組:

var uniqueStringArray = uniqueStrings.ToArray();

您可以保留字符串哈希值的列表嗎?

添加新字符串時,如果列表中尚未包含其哈希值,則說明它是唯一的。

如果存在哈希,它可能是唯一的,或者可能是哈希沖突,因此您必須檢查很長的路要走。 但這應該是一個相對罕見的情況。

您可以使用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方法的行為不同,后者會返回輸入序列中的所有元素,包括重復項。

您可以使用將為您執行過濾的Hashset

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

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

uniqueStrings = strings.ToArray();

使用HashSet<string> 這是有關列表工作方式的更多信息: http : //msdn.microsoft.com/zh-cn/library/bb359438.aspx

您是否考慮過將字符串存儲在HashSet中而不是存儲在數組中? 每次添加到哈希集后,它都將在恆定時間內保證唯一性。

var strings = new HashSet<string>();
strings.Add("abc");
strings.Add("abc");
strings.Count // is 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM