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

时间:2014-07-08 19:25:37

标签: c# linq

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

考虑两个列表,这两个列表被简化以展示我所追求的内容。一个是完整的部件号。

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规则匹配{。}}。

我已经能够以一种看似笨拙的方式做到这一点,但有兴趣是否可以用LINQ单行做这件事。

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

278700

实现规则的方法中的代码。为简单起见,我只是递增优先级值,但实际上我想在List.FindAll()中使用lamda,它返回一个列表匹配每个零件号的规则。

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

public class Part
{
    public string PartNumber;
    public int Priority;
}

而不是 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; } } } ,我正在寻找像这样的LINQ函数:

foreach (Rule r

2 个答案:

答案 0 :(得分:1)

您可以尝试使用StartsWith方法:

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

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

答案 1 :(得分:1)

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

怎么样?

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