Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组合Linq查询的特定结果_C#_Linq - Fatal编程技术网

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()
            });