我想按特定类别对表进行分组。
类别如下:"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; }
}
答案 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()
});
我不确定这是不是一个好主意,因为你很可能会得到你需要修改的奇怪的组密钥。然后修改代码与比较代码位于不同的位置,即使逻辑应该相同。因此,将来会遇到一些麻烦。