结合Linq查询的特定结果

时间:2017-02-28 20:20:58

标签: c# linq

我想按特定类别对表进行分组。

类别如下:"AAA", "BBB", "CCC", "DDD", "EEE", etc...使用下面的代码,我可以轻松获得每个组的结果。但是,有一种特殊情况,应该组合两个类别并生成一个新密钥(例如,类别BBB和DDD最终应该作为一个类别)。

我的最终结果应该是这样的: 密钥:“AAA”,项目:( AAA下的项目) 关键:“BBB / DDD”,项目:( BBB和DDD下的项目) 关键:“CCC”,项目:( CCC下的项目)

我已经有一段时间了,并且无法获得任何有用的东西。

var query= ds.Tables[0].AsEnumerable()
            .GroupBy(g => g.Field<string>("category"))
            .Select(a => new workType
            {
                Key = a.Key,
                Item = a.ToList()
            });

public class workType
{
    public string Key { get; set; }
    public List<DataRow> Item { get; set; }
}

1 个答案:

答案 0 :(得分:1)

基本上,您需要做的就是在分组之前转换密钥:

var sequence = ds.Tables[0].AsEnumerable();

var result = sequence
        .Select(e => new { Key = GetCompoundKey(e.Field<string>("category")), Value = e })
        .GroupBy(e => e.Key)
        .Select(g => new { Key = g.Key, Items = g.SelectMany(e => e.Value).ToList() });


private static string GetCompoundKey(string originalKey)
{
    if (originalKey.Equals("BBB") || originalKey.Equals("DDD"))
    {
        return "BBB/DDD";
    }

    return originalKey;
}

除此之外,GroupBy有一个需要IEqualityComparer<T>的重载,因此您可以编写IEqualityComparer<string>实现并使用它:

private class KeysEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (x.Equals(y))
        {
            return true;
        }

        return (x.Equals("BBB") && y.Equals("DDD"))
            || (x.Equals("DDD") && y.Equals("BBB"));
    }

    public int GetHashCode(string str)
    {
        return str.GetHashCode();
    }
}

// your original code using the comparer:
var query= ds.Tables[0].AsEnumerable()
            .GroupBy(g => g.Field<string>("category"), new KeysEqualityComparer())
            .Select(a => new workType
            {
                Key = a.Key,
                Item = a.ToList()
            });

我不确定这是不是一个好主意,因为你很可能会得到你需要修改的奇怪的组密钥。然后修改代码与比较代码位于不同的位置,即使逻辑应该相同。因此,将来会遇到一些麻烦。