如何从两个列表中分组?

时间:2019-04-08 05:59:35

标签: c# linq

我有两个IEnumerable,一个具有“必备”键基,另一个具有许多具有各种拼写方式的键(相同的值,但包含转义序列,大写字母等)。我想在第一个列表的每个键到与第二个列表中的字符串对应的所有键之间建立一个映射(谓词为bool IsPossibleMatch(string a, string b)

所以基本上我想要一个IGrouping<string, IEnumerable<string>>,因为那正是我要寻找的东西的结构。

我尝试了keys.GroupBy((x,y) => IsPossibleMatch(x, y))的各种版本,但其中的任何一个都无法正常工作。

现在我想知道:分组依据是否有可能?还是我需要以其他某种方式手动执行此操作?

1 个答案:

答案 0 :(得分:4)

这是示例代码:

ifstream is {"fox.txt"};
is.imbue(locale(locale(), new line_reader()));
istream_iterator<string> ii {is};
istream_iterator<string> eos {};

ofstream os {"out.txt"};
ostream_iterator<string> oi {os,"\n"};

vector<string> lines {ii,eos};
copy(lines.begin(), lines.end(), oi);

产生以下输出:

var left = new string[] {
    "key1",
    "key2",
    "key3",
    "key4",
    "key5"
};
var right = new string[]
{
    "key1",
    "Key1",
    "KEy1",
    "KEY1",
    "KeY1",
    "kEY1",
    "kEy1",
    "key2",
    "Key2",
    "KEy2",
    "KEY2",
    "KeY2",
    "kEY2",
    "kEy2"
};
var output = left.GroupJoin(
    right,
    leftStr => leftStr.ToLower(),
    rightStr => rightStr.ToLower(),
    (x,y)=>(x,y)
);
foreach (var leftKey in output)
    Console.WriteLine(leftKey.x + "->" + string.Join(",", leftKey.y));