[英]Check if string does not contain strings of an array of string in C# in query from Entity Framework
[英]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.