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

C# LINQ将匹配另一个列表中的子字符串,c#,linq,C#,Linq,我想将一个项目列表与另一个列表进行匹配,其中考虑部分匹配 考虑一下这两个列表,它们是相似的,以证明我在追求什么。一个是完整的零件号 Part Number Priority 278700-002 44 278700-003 40 278900-001 80 324100-001 20 第二个列表有一组零件号规则,但此列表只能包含前缀: Part Prefix Priority Delta 278700

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

考虑一下这两个列表,它们是相似的,以证明我在追求什么。一个是完整的零件号

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 one衬里来实现这一点

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

public class Rule
{
    public string PartPrefix;
    public int PriorityBump;
}

public class Part
{
    public string PartNumber;
    public int Priority;
}
以及实现规则的方法中的代码。为简单起见,我只是增加优先级值,但实际上我希望List.FindAll()中有一个lamda,它返回一个列表,为每个零件号匹配规则

    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;
            }
        }
    }

您可以尝试使用
StartsWith
方法:

var prefixes = parts.Select(x => x.PartNumber).ToArray();

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

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

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

var prefixes = parts.Select(x => x.PartNumber).ToArray();

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