将逗号分隔的字符串拆分并在列表中比较每个值

4
我有一个以下面的格式的csv文件:

enter image description here

这个规则表被加载到一个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只有一个值时,这是很好获取文档类型的。但当存在逗号分隔的多个值时,我尝试了以下内容:

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

期望的是,如果 lsruleValues 有4个条目:

标题保险单A、标题保险单B-第I部分、标题保险单B-第II部分、标题保险单。

那么兄弟文件类型应该是一个列表,其中包括:

标题认可、标题保险单A、标题保险单B-第I部分、标题保险单B-第II部分。


你是否意识到你的方案违反了数据库规范化?请阅读:https://dev59.com/gHA65IYBdhLWcg3wvxaE - user57508
1个回答

3

好的,我想我已经理解了你想做什么。你真正想做的是检查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(其性能较好,但建立时间可能更差-您必须找到最佳点)。 - user57508
1
我不知道是否有一种“Join”重载,它不需要键选择器和结果选择器。 - juharr
@juharr - 你说得对。我不知道我在想什么。 - Jason Boyd
@JasonBoyd 感谢您的回复,但是这个 join 没有 keyselector 和 resultselector,可能这就是它出现“没有重载的 join 接受 1 个参数”的问题的原因。 - Maverick
@JasonBoyd,你对join()参数的修改现在可以使用了。谢谢。 - Maverick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接