簡體   English   中英

檢查字符串列表是否包含字符串的確切部分

[英]Check if list of string contains exact part of string

我有一個字符串列表如下,

 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);

iteminputSplitted是 arrays 的string ,所以對它們調用的Any只是檢查那些 arrays 是否不為空(即它們中是否有任何字符串),對於提供的示例,它總是評估為true

如果我正確理解規則 - 輸入應該作為完整字符串出現在原始集合中或作為逗號原始集合拆分的一部分 - 你應該比較 collections 中的字符串。快速修復將使用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)來重建搜索和輸入字符串,然后再連接回去.

Guru Stron 有一個很好的答案。 一個簡單易讀的問題解決方案是獲取用戶輸入,將其拆分(並修剪),並對要檢查的字符串列表執行相同的操作,然后執行類似

inputSplitted.All(s => plates.Contains(s));

或者使用方法組: inputSplitted.All(plates.Contains);

這假設我正確理解您的問題,並且輸入順序等無關緊要。 你只是想知道用戶寫的每個數字是否在列表中的某個地方。

暫無
暫無

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

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