LINQ匹配另一个列表中的子字符串

本文关键字:字符串 列表 另一个 LINQ | 更新日期: 2023-09-27 18:11:57

我想将一个项目列表与另一个列表进行匹配,其中考虑部分匹配。

考虑这两个列表,它们经过简化以演示我所追求的内容。一是完整的零件编号。

Part Number        Priority
278700-002         44
278700-003         40
278900-001         80
324100-001         20

第二个列表有一组零件号规则,但该列表可能只包含一个前缀:

Part Prefix      Priority Delta
278700           1
278700-002       1
3                -5
8000             2

我希望找到一个LINQ表达式,使我能够找到一个给定部分的所有规则。这意味着,例如,278700-002将同时匹配278700-002规则和278700规则。

我已经能够用一种看起来很笨拙的方法来做到这一点,但是我很感兴趣的是,如果有可能用LINQ一行程序来做到这一点。

下面是每个对象的概念示例:

public class Rule
{
    public string PartPrefix;
    public int PriorityBump;
}
public class Part
{
    public string PartNumber;
    public int Priority;
}

以及方法中实现规则的代码。为了简单起见,我只是增加优先级值,但实际上我希望在list . findall()中使用lambda,其中它返回每个零件号的匹配规则列表。

    List<Part> parts;
    List<Rule> rules;
    public static void RePrioritize()
    {
        foreach (Part p in parts)
        {
            foreach (Rule r in rules)
            {
                if (r.PartPrefix.Equals(p.PartNumber.Substring(0,
                    r.PartPrefix.Length)))
                    p.Priority += r.PriorityBump;
            }
        }
    }

而不是foreach (Rule r,我正在寻找这样的LINQ函数:

rules.FindAll(x => x.PartPrefix.IsContainedIn(p.PartNumber));

LINQ匹配另一个列表中的子字符串

rules.Where(x => p.PartNumber.StartsWith(x.PartPrefix));

我没有给出更大的LINQ,因为您指定只替换内部foreach (foreach (Rule r),而不是外部foreach。

您可以尝试使用StartsWith方法:

var prefixes = parts.Select(x => x.PartNumber).ToArray();
var result = rules.Where(x => prefixes.Any(p => p.StartsWith(x.PartPrefix));