C# 组合Linq查询的特定结果
我想按特定类别对表进行分组 分类如下:C# 组合Linq查询的特定结果,c#,linq,C#,Linq,我想按特定类别对表进行分组 分类如下:“AAA”、“BBB”、“CCC”、“DDD”、“EEE”等。使用下面的代码,我可以轻松获得每组的结果。但是,在一种特殊情况下,应将两个类别合并并生成一个新的密钥(例如,类别BBB和DDD应作为一个类别结束) 我的最终结果应该是: 关键字:“AAA”,项目:(AAA项下的项目) 关键字:“BBB/DDD”,项目:(BBB和DDD下的项目) 关键词:“CCC”,项目:(CCC项下的项目) 我做这件事已经有一段时间了,没有任何有效的方法 var query= d
“AAA”、“BBB”、“CCC”、“DDD”、“EEE”等。
使用下面的代码,我可以轻松获得每组的结果。但是,在一种特殊情况下,应将两个类别合并并生成一个新的密钥(例如,类别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; }
}
var query=ds.Tables[0].AsEnumerable()
.GroupBy(g=>g.Field(“类别”))
.选择(a=>新工作类型
{
钥匙,
Item=a.ToList()
});
公共类工作类型
{
公共字符串密钥{get;set;}
公共列表项{get;set;}
}
基本上,您只需在按键分组之前变换键:
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;
}
我不确定这是否是一个好主意,因为你很可能会得到奇怪的组密钥,你无论如何都需要修改。然后修改代码与比较代码位于不同的位置,即使逻辑应该是相同的。因此,这会给未来带来一些麻烦。如果没有一些参数,这是不可能的。你正在选择一个
键,你说它是“AAA”,“BBB”等等。您必须提供一些其他功能,如Key=a.Key | | b.Key
。我看不到一个通用的方法来解决这个问题。您的方法的问题是,即使在只有BBB
或只有DDD
类别存在的情况下,它也会创建一个复合键BBB/DDD
。这可能是OP想要的,也可能不是OP想要的。您的第一个解决方案正好满足了我的需要。谢谢。@dasblinkenlight只是出于好奇,实际上是否有合适的用例,让您先按超集对某些内容进行分组,然后对元素来自哪个子集感兴趣?那么,你为什么要按超集分组呢?@ZdeněkJelínek你的问题意味着一个解决方案,这不是唯一的。只有在分析子集之后,才能通过在超集上分组来求解。事实证明,OP只是错误地将BBB和DDD分类,因为他将它们视为一个单独的类别。
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()
});