C# 将2个列表数据与部分匹配进行比较,并从两个列表返回聚合数据

C# 将2个列表数据与部分匹配进行比较,并从两个列表返回聚合数据,c#,linq,C#,Linq,我有以下两个列表,其中我需要将masterData的名称与sampleData的名称进行部分匹配,并需要从sampleData输出为Name,从Master输出为Version。(Name\u版本) 我一直尝试到部分匹配,在这里我为所有Master数据准备了一个带有“|”分隔符的长字符串,但无法找出如何准备所需的输出 var regexPattern = masterData.Aggregate(string.Empty, (current, md) => current + $"

我有以下两个列表,其中我需要将
masterData的
名称与
sampleData的
名称进行部分匹配,并需要从
sampleData
输出为
Name
,从
Master
输出为
Version
。(
Name\u版本

我一直尝试到部分匹配,在这里我为所有
Master
数据准备了一个带有“|”分隔符的长字符串,但无法找出如何准备所需的输出

var regexPattern = masterData.Aggregate(string.Empty, (current, md) => current + $"{md.Name}|");

var output = (from data in sampleData
    let IsMatched = Regex.IsMatch(data.Name, regexPattern.TrimEnd('|'), RegexOptions.IgnoreCase)
    where IsMatched
         select data).ToList();

将您的选择更改为:

select data.Name.Split()[2] + "_" + data.Version
您的第一个字母似乎也是大写的,在这种情况下,您可以使用以下扩展方法:

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", 
              nameof(input)),
            _ => input.First().ToString().ToUpper() + input.Substring(1)
        };
}
因此,您的选择如下所示:

select data.Name.Split()[2].FirstCharToUpper() + "_" + data.Version
public static class StringExtensions
{
    public static bool ContainsIgnoreCase(this string s, string value)
    {
        return (s.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0);
    }
}

这里有一个没有正则表达式的解决方案:

var output = 
    sampleData.Select(sd =>
    {
        var master = masterData.FirstOrDefault(m => sd.Name.ContainsIgnoreCase(m.Name));
        return (master is null ? null
                : new SampleData { Name = $"{master.Name}_{sd.Version}" });
    })
    .Where(sd => sd != null)
    .ToList();
其中,
ContainsIgnoreCase()
是一个如下所示的扩展方法:

select data.Name.Split()[2].FirstCharToUpper() + "_" + data.Version
public static class StringExtensions
{
    public static bool ContainsIgnoreCase(this string s, string value)
    {
        return (s.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0);
    }
}