我有一個字串串列如下,
List<string> str = new List<string>() { "7, 31", "2, 4", "5, 6" };
我的輸入將類似于“1、2”或“1”
有沒有辦法比較字串串列中的任何專案是否與輸入完全匹配。在上述情況下,它應該回傳 false。但是,如果我的輸入是“31”,它應該給我一個真值,或者如果我的輸入是“7, 31”,它也應該給我一個真值。
我嘗試了這段代碼,但它總是回傳 true。請幫忙。
bool res = false;
List<string> substrings = new List<string>() { "7, 31", "2, 4", "5, 6" };
string input = "1"; //Because my input can be "1" or "1, 31" etc spltting it.
var inputSplitted = input.Split(',');
var plates = substrings.Select(x => x.Split(','));
foreach (var item in plates)
{
if (item.Any() == inputSplitted.Any())
{
res = true;
}
}
Console.WriteLine(res);
uj5u.com熱心網友回復:
item并且inputSplitted是 的陣列string,因此Any呼叫它們只是檢查這些陣列是否不為空(即其中是否有任何字串),true對于提供的示例,它們總是會評估為。
如果我正確理解規則 - 輸入應該作為原始集合中的完整字串或作為逗號原始集合拆分的一部分存在 - 您應該比較集合中的字串。快速修復將使用SequenceEqual對一個元素輸入的額外處理(而且您似乎需要呼叫.Select(s => s.Trim()).ToArray()兩個拆分結果):
if (item.SequenceEqual(inputSplitted)
|| (inputSplitted.Length == 1 && item.Contains(inputSplitted.First())))
{
res = true;
}
但一般來說,如果多次執行此類搜索,則會導致性能不佳。我建議使用HashSet這樣的搜索:
var hash = substrings
.SelectMany(s => s.Split(",").Select(s => s.Trim())) // flatten split strings
.Concat(substrings) // and concatenate with original
.ToHashSet();
var res = hash.Contains(input); // search in collection (should be prepared one time)
如果專案的順序不重要(即“7, 31”和“31, 7”相同),您可以通過拆分搜索和輸入字串并OrderBy(s => s)在連接之前使用拆分結果來重建搜索和輸入字串。
uj5u.com熱心網友回復:
Guru Stron 有一個很好的答案。一個簡單易讀的問題解決方案是獲取用戶輸入,將其拆分(并修剪),并對要檢查的字串串列執行相同操作,然后執行類似的操作
inputSplitted.All(s => plates.Contains(s));
或使用方法組:inputSplitted.All(plates.Contains);
這假設我正確理解了您的問題,并且輸入順序等無關緊要。你只想知道用戶寫的每個數字是否在串列中的某個地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/475458.html
上一篇:字串串列存在于字典鍵串列中?
