我想将项目列表与另一个列表进行匹配,其中会考虑部分匹配。
考虑两个列表,这两个列表被简化以展示我所追求的内容。一个是完整的部件号。
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
答案 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。