c# - 比较 2 个列表数据与部分匹配并从两个列表返回聚合数据
问题描述
我有以下 2 个列表,我需要将masterData's
Name与sampleData's
Name进行部分匹配,并且需要输出Name
fromMaster
和Version
from 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"}
};
当有部分匹配时,我正在寻找的Name
预期Master
Version
SampleData
输出。
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();
解决方案
这是一个没有正则表达式的解决方案:
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);
}
}
在线演示。
推荐阅读
- android - 什么是 /storage/emulated/0/?
- php - MYSQL - GROUP BY - PHP 查询
- ios - Cordova 键盘插件与屏幕大小调整和聚焦有关的问题
- ios - 加载视图控制器后如何设置动画
- sql - SQL Server:使用函数计算新列
- c# - 更改绑定列表中的值?
- python - TypeError:gettext()缺少1个必需的位置参数:'self'-python
- tensorflow - 将tensorflow填充值转换为caffe填充值的公式?
- python-2.7 - 具有 3 个类的图像分割,但其中之一很容易找到,我如何编写网络而不在简单的类上进行训练?
- c# - 如何在 C# 中记录低级 OS 文件事务?