比较部分匹配的2个列表数据,并从两个列表中返回汇总数据

时间:2020-11-11 13:43:19

标签: c# linq

我在下面的2个列表中需要对masterData's 名称sampleData's 名称进行部分匹配,并需要将输出作为{{1 }}来自NameMaster来自Version。 (SampleData

Name_version

预期的输出结果我正在寻找部分匹配的var masterData = new List<Master> { new Master{Name = "Master1"}, new Master{Name = "Master2"}, new Master{Name = "Master3"}, new Master{Name = "Master4"} }; var sampleData = new List<SampleData> { new SampleData{Name = "this is master1", Version = "20.01"}, new SampleData{Name = "this is master1", Version = "20.02"}, new SampleData{Name = "this is master3", Version = "23.01"}, new SampleData{Name = "this is master5", Version = "20.01"} }; 的{​​{1}}和Name的{​​{1}}

Master

我一直试着直到部分匹配,在其中为所有Version数据准备一个长字符串,并带有“ |”定界符,但无法弄清楚如何准备所需的输出。

SampleData

2 个答案:

答案 0 :(得分:1)

将选择更改为此:

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

答案 1 :(得分:1)

这是不使用正则表达式的解决方案:

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()是以下扩展方法:

public static class StringExtensions
{
    public static bool ContainsIgnoreCase(this string s, string value)
    {
        return (s.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0);
    }
}

Online demo