LINQ C# - 组合多个组

cod*_*obo 2 c# linq group-by

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查询实现这一目标?

Mik*_*Two 6

您将需要使用带有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)