繁体   English   中英

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

[英]Compare 2 list data with partial match and return aggregated data from both list

下面我有2只列出了,我需要做的部分匹配masterData's名称sampleData's名称和需要的输出Name来自MasterVersionSampleData 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"}
};

当存在部分匹配时,我正在寻找的预期输出,来自Master Name和来自SampleData Version

 var output = new List<SampleData>
{
    new SampleData{Name = "Master1_20.01"}, 
    new SampleData{Name = "Master1_20.02"},
    new SampleData{Name = "Master3_23.01"}
};

我尝试直到部分匹配,在那里我为所有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

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

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

在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM