将 HashSet<string> 与 LINQ 中的字符串数组进行比较?

问题描述 投票:0回答:1

我有一个名为 LabelFilter 的列表。标签有一个名称字段,它只是一个字符串,例如“Test1”或“Test2”等。我可以轻松地将这个列表转换为字符串类型的数组或长字符串。唯一重要的是字符串而不是 ID。

我有一个 IQueryable 结果,这是我正在过滤的数据集。每个日志包含一个名为 Label 的字段,该字段可以是以下“Test2”或“Test2、Test3、Test1”或 NULL 或“Test3、Test1”中的任何内容。

我只想返回至少有一个匹配字符串的记录。

例如,如果 LabelFilter 包含标签“Test1”和“Test3”,则应返回标签等于“Test2,Test3,Test1,”和“Test3,Test1,”的结果。

我在使用时收到 CS0854 - 表达式树可能不包含使用可选参数的调用或调用错误:

results = results.Where(result => result.Label != null && result.Label.Split(',').Where(x => sb.ToString().Contains(x))));

此后我尝试了几种不同的方法,但我仍然没有得到我预期的结果:(

这也是我尝试过的:

if (LabelFilter != null && LabelFilter.Count > 0)
    {
        var labelArray = new HashSet<string>(LabelFilter.Select(s => s.Name)); // labelArray[0] = "Onhold" 


        foreach (var item in results)
        {
            if ( item.Label != null)
            {
                var t = item.Label.Split(",", System.StringSplitOptions.None); // t[0] = "Onhold" / t[1] = "Test" / t[2] = "test4" / t[3] = "" 

                var s = item.Label.Split(',', StringSplitOptions.TrimEntries); // s[0] = "Onhold" / s[1] = "Test" / s[2] = "test4" / s[3] = ""

                // Currently using
                var u = item.Label.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); // u[0] = "Onhold" / u[1] = "Test" / u[2] = "test4" 

                var v = item.Label.Split(',').Where(x => !string.IsNullOrWhiteSpace(x)); // IEnumerable v[0] = "Onhold" / v[1] = "Test" / v[2] = "test4" 
            }             
        }


        results = results.Where(r => r.Label != null && r.Label.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Where(x => !string.IsNullOrWhiteSpace(x)).Any(l => labelArray.Contains(l)));
}
c# string csv linq hashset
1个回答
0
投票

如果正确读取输入数据,字符串分割后的

Label
值将包含空格。

我们举个例子:“测试3”

当与

new string[] { "Label1", "Label3" }.Contains("Test 3 ")

除非您修剪“测试 3”,否则这不会返回 true。因此,您必须修剪字符串分割后的值才能使过滤起作用。

results = results.Where(r => r.Label != null 
                        && r.Label.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                            .Where(x => !string.IsNullOrWhiteSpace(x))
                            .Any(l => labelArray.Contains(l.Trim())));

或者

results = results.Where(r => r.Label != null 
                        && r.Label.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                            .Where(x => !string.IsNullOrWhiteSpace(x))
                            .Select(x => x.Trim())
                            .Any(l => labelArray.Contains(l)));
© www.soinside.com 2019 - 2024. All rights reserved.