使用不区分大小写的搜索过滤字典

Posted

技术标签:

【中文标题】使用不区分大小写的搜索过滤字典【英文标题】:Filter Dictionary with a case insensitive search 【发布时间】:2017-01-19 23:24:59 【问题描述】:

这是关于如何Filter a Dictionary 的后续问题,只有我需要过滤器不区分大小写

我有一本在 Swift 3 中填充 Pickerview 的字典。

var facilityDict:       [Int: [String: String]] = [:]

17: ["id": "199", "facilitycode": "036", "location_name": "中心点 医务室"], 41:[“id”:“223”,“设施代码”:“162”, "location_name": "黑岭医疗中心"], 14:[“id”:“196”, "facilitycode": "023", "location_name": "Spinnerpark"], 20:[“身份证”: "202", "facilitycode": "048", "location_name": "教育剧院"], 30:[“id”:“212”,“设施代码”:“090”,“location_name”:“合作伙伴 医务室"], 49:[“id”:“231”,“设施代码”:“223”, "location_name": "GreenBay 行政办公室"]

字典很长。我有一个Textbox,它在数据更改时触发,我用它来创建一个搜索变量。如果有人输入“ar”,我想过滤字典中包含字符“ar”的所有内容,以便我可以使用原始大字典列表中更小的子部分重置选取器列表。

过滤器 let filteredDictionaries = facilityDict.filter$0.value.contains(where: $0.value.contains("ar")).map$0.value 似乎可以很好地过滤字典,但是我需要搜索不区分大小写。我可以设置哪些选项来将过滤器显示更改为不区分大小写?

【问题讨论】:

知道了。所以在这个例子中它是let filteredDict = self.sharedDataVal.departmentDict.filter$0.value.contains(where: ($0.value.range(of: srchval, options: .caseInsensitive) != nil)).map$0.value 【参考方案1】:

包含方法它与range(of: "String") != nil 相同,没有任何选项。您只需要使用 String != nil 的范围和不区分大小写的选项:

extension String 
    func contains(_ string: String, options: CompareOptions) -> Bool 
        return range(of: string, options: options) != nil
    

现在你可以这样做了:

"whatever".contains("ER", options: .caseInsensitive)

如果您需要从字典数组创建字典,则需要使用 forEach 遍历结果并从中重建字典:


let facilityDict: [Int: [String: String]] = [
    17: ["id": "199", "facilitycode": "036", "location_name": "Centerpoint Medical Offices"],
    41: ["id": "223", "facilitycode": "162", "location_name": "Dark Ridge Medical Center"],
    14: ["id": "196", "facilitycode": "023", "location_name": "Spinnerpark"],
    20: ["id": "202", "facilitycode": "048", "location_name": "Educational Theater"],
    30: ["id": "212", "facilitycode": "090", "location_name": "Partner Medical Offices"],
    49: ["id": "231", "facilitycode": "223", "location_name": "GreenBay Administrative Offices"]]

var filtered: [Int: [String: String]] =  [:]

facilityDict.filter$0.value.contains$0.value.contains("AR", options: .caseInsensitive).forEachfiltered[$0.key] = $0.value

print(filtered)  // [30: ["id": "212", "facilitycode": "090", "location_name": "Partner Medical Offices"], 41: ["id": "223", "facilitycode": "162", "location_name": "Dark Ridge Medical Center"], 14: ["id": "196", "facilitycode": "023", "location_name": "Spinnerpark"]]

【讨论】:

Leo,过滤器效果很好。但是结果是 [[String: String]]。我需要将结果返回到 [Int: [String: String]]。有什么建议吗? 我在 .caseInsensitive 上收到“单元格中的额外参数'选项'”错误。我还注意到包含将匹配上面示例中的任何“AR”。如果我需要它来匹配诸如“AR 医疗中心”条目而不匹配“Spinnerpark”条目之类的明确内容怎么办?感谢协议提示!!!新手。 Leo,我还有一个额外的担忧,即我在稍微不同的数据上使用此过滤器,并且过滤器仅匹配正确的数据我得到重复值。我应该将其作为一个不同的问题打开吗?

以上是关于使用不区分大小写的搜索过滤字典的主要内容,如果未能解决你的问题,请参考以下文章

字符串的字典比较[不区分大小写]

如何将不区分大小写的字典映射到 NHibernate。?

MS Access + Postgres 口音/不区分大小写的可编辑过滤器

Swift中不区分大小写的字典

使用“/”和“ - ”进行不区分大小写的搜索

javascript过滤关键词不区分大小写字母的问题