[英]Compare 2 list data with partial match and return aggregated data from both list
下面我有2只列出了,我需要做的部分匹配masterData's
名称用sampleData's
名称和需要的输出Name
来自Master
和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"}
};
当存在部分匹配时,我正在寻找的预期输出,来自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.