LINQ Groupby查询为每个唯一键创建一个新组.我想根据键值将多个组合并为一个组.
例如
var customersData = new[]
{
new { id = 1, company = "ABC" },
new { id = 2, company = "AAA" },
new { id = 3, company = "ABCD" },
new { id = 4, company = "XYZ" },
new { id = 5, company = "X.Y.Z." },
new { id = 6, company = "QQQ" },
};
var groups = from d in customersData
group d by d.company;
Run Code Online (Sandbox Code Playgroud)
假设我想在同一组中使用ABC,AAA和ABCD,在同一组中使用XYZ,XYZ.
无论如何通过LINQ查询实现这一目标?
您将需要使用带有IEqualityComparer的GroupBy的重载.
var groups = customersData.GroupBy(k => k.company, new KeyComparer());
Run Code Online (Sandbox Code Playgroud)
KeyComparer的样子
public class KeyComparer : IEqualityComparer
{
public bool Equals(string x, string y)
{
// put your comparison logic here
}
public int GetHashCode(string obj)
{
// same comparison logic here
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在KeyComparer的Equals方法中以任何方式比较字符串.
编辑:
您还需要确保GetHashCode的实现遵循与Equals方法相同的规则.例如,如果你刚刚删除了"." 并在其他答案中替换为"",你需要在这两种方法中做到这一点
public class KeyComparer : IEqualityComparer
{
public bool Equals(string x, string y)
{
return x.Replace(".", "") == y.Replace(".", "");
}
public int GetHashCode(string obj)
{
return obj.Replace(".", "").GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)