我在下面的2个列表中需要对masterData's
名称与sampleData's
名称进行部分匹配,并需要将输出作为{{1 }}来自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"}
};
的{{1}}和Name
的{{1}} 。
Master
我一直试着直到部分匹配,在其中为所有Version
数据准备一个长字符串,并带有“ |”定界符,但无法弄清楚如何准备所需的输出。
SampleData
答案 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);
}
}