两个列表的关联索引

时间:2016-08-09 05:55:06

标签: c# regex linq

我有两个清单:

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",
};

xy是随机字符。

我想创建一个字典,其中关联具有相同颜色的值

预期产出:

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?还是用正则表达式?

1 个答案:

答案 0 :(得分:4)

使用Linq的JoinString.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);