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