我有两个清单:
List<string> List1 = new List<string>()
{
"xxxxxxxx_green_xxxxxxxxxxxxx",
"xxxxxxxx_yellow_xxxxxxxxxxxxx",
"xxxxxxxx_blue_xxxxxxxxxxxxx",
"xxxxxxxx_white_xxxxxxxxxxxxx",
};
List<string> List2 = new List<string>()
{
"yyyyyyyy_blue_yyyyyyyyyyyyy",
"yyyyyyyy_green_yyyyyyyyyyyyy",
"yyyyyyyy_white_yyyyyyyyyyyyy",
"yyyyyyyy_yellow_yyyyyyyyyyyyy",
};
x
和y
是随机字符。
我想创建一个字典,其中关联具有相同颜色的值
预期产出:
Dictionary<string, string> ExpectedDictionary = new Dictionary<string, string>()
{
{"xxxxxxxx_green_xxxxxxxxxxxxx", "yyyyyyyy_green_yyyyyyyyyyyyy"},
{"xxxxxxxx_yellow_xxxxxxxxxxxxx", "yyyyyyyy_yellow_yyyyyyyyyyyyy"},
{"xxxxxxxx_blue_xxxxxxxxxxxxx", "yyyyyyyy_blue_yyyyyyyyyyyyy"},
{"xxxxxxxx_white_xxxxxxxxxxxxx", "yyyyyyyy_white_yyyyyyyyyyyyy"}
};
最好的方法是什么?用linq?还是用正则表达式?
答案 0 :(得分:4)
使用Linq的Join
和String.Split
:
var ExpectedDictionary = (from l1 in List1
join l2 in List2
on l1.Split('_')[1] equals l2.Split('_')[1]
select new
{
V1 = l1,
V2 = l2
}).ToDictionary(x => x.V1, x => x.V2);
要处理无效输入,可以使用正则表达式:
private string getColor(string value)
{
var matches = Regex.Matches(value, "_(.*?)_");
foreach(Match match in matches)
{
int counter = 0;
foreach(Group group in match.Groups)
{
if (counter++ == 0)
continue;
string color = group.Value;
if (!String.IsNullOrWhiteSpace(color))
return color.ToLower();
}
}
return null;
}
然后我们需要将查询更改为:
var ExpectedDictionary = (from l1 in List1
join l2 in List2
on getColor(l1) equals getColor(l2)
select new
{
V1 = l1,
V2 = l2
}).ToDictionary(x => x.V1, x => x.V2);
使用Lambda语法:
var ExpectedDictionary2 = List1.Join(List2, l1 => getColor(l1),
l2 => getColor(l2),
(l1, l2) => new { V1 = l1, V2 = l2 })
.ToDictionary(x => x.V1, x => x.V2);