【问题标题】:Split comma separated string and compare each value in a List拆分逗号分隔的字符串并比较列表中的每个值
【发布时间】:2015-10-16 14:00:47
【问题描述】:

我有一个格式如下的 csv 文件:

此规则表加载在 List<DoctypeRule> 对象中,我使用此列表根据 RuleCode 和 RuleValue 获取 DocType 值。 DoctypeRule 类如下所示

public class DoctypeRule 
{
    public string doctype {get; set; }
    public string ruleCode {get; set; }
    public string ruleValue {get; set; }
}

现在,要获取规则,我使用 LINQ 并传递参数。

DoctypeRule rule = new DoctypeRule();
rule = lsdoctypeRules.Find(r => r.docType == myparameter);

我还想获取具有类似规则的文档类型并存​​储在列表中。由于某些 RuleValue 将具有逗号分隔值,因此我无法获取具有相似规则的文档类型 示例:

string ruleCode = rule.ruleCode;;
string ruleValue = rule.ruleValue;
List<string> lsruleValues = ruleValue.Split(',').ToList();

现在收集具有我使用的类似规则的文档类型

var siblingDoctypes = lsdoctypeRules
                    .Where(r => r.ruleValue == ruleValue && r.ruleCode == ruleCode)
                    .Select(x => x.docType);

当 RuleValue 只有一个值时,这很适合获取 doctypes。但是当有逗号分隔的值时,我尝试了这样的方法

var siblingDoctypes = lsdoctypeRules                    
                    .Where(r => r.ruleValue.Split(',').ToList().Any(lsruleValues.Any().ToString()) && r.ruleCode == ruleCode)
                    .Select(x => x.docType);

如果lsruleValues 有 4 个项目,则预期结果

产权政策附表 A、产权政策附表 B-第一部分、产权政策 附表 B-第 II 部分,标题政策

那么兄弟文档类型应该是一个列表

产权背书、产权政策附表 A、产权政策附表 B-Part I,Title Policy Schedule B-Part II.

【问题讨论】:

标签: c# linq list split ienumerable


【解决方案1】:

好的,我想我已经完全理解了你想要做的事情。您真正想要做的是检查lsruleValues 是否包含任何规则值。我相信这会成功:

var siblingDoctypes = 
    lsdoctypeRules                    
    .Where(r => r.ruleCode == ruleCode &&
        r.ruleValue
        .Split(new char[] { ',' })
        .Join(
            lsruleValues,
            x => x,
            y => y,
            (x, y) => x)
        .Any())
    .Select(x => x.docType);

您也可以考虑使用不区分大小写的字符串比较。

【讨论】:

  • 请注意:性能将为 0(n) - 根据出现位置的大小,您应该寻找拆分和连接或使用 HashSet(其性能更好,但累积时间可能更糟 - 你必须找到最佳位置)。
  • 我不知道不需要键选择器和结果选择器的 Join 重载。
  • @juharr - 你是对的。我不知道我在想什么。
  • @JasonBoyd 感谢您的回复,但此连接没有键选择器和结果选择器,这可能是它给出“连接没有过载需要 1 个参数”问题的原因。
  • @JasonBoyd 您对 join() 参数的编辑现在有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2018-12-21
  • 1970-01-01
相关资源
最近更新 更多