You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将按类型和ID分组的列表作为方法参数传递?

解决方案

你的问题核心是匿名类型无法直接作为方法参数的显式类型,因为匿名类型的类型名称由编译器生成,无法在方法签名中直接引用。下面提供两种实用的解决方式:


方式一:使用ValueTuple(推荐,简洁高效)

C# 7.0及以上支持ValueTuple,它自带正确的相等性实现,非常适合作为分组键:

1. 修改分组逻辑

将匿名分组键替换为ValueTuple:

public void DoSomethingA(){
    List<Document> Documents = new List<Document>();
    Documents.Add(new Document { Id = 1, DocumentType = "TypeA", Description = "DescriptionA" });
    Documents.Add(new Document { Id = 2, DocumentType = "TypeB", Description = "DescriptionB" });
    Documents.Add(new Document { Id = 3, DocumentType = "TypeC", Description = "DescriptionC" });

    // 使用ValueTuple作为分组键
    var groupedDocuments = Documents.GroupBy(item => (item.DocumentType, item.Id)).ToList();
    DoSomethingB(groupedDocuments);
}

2. 定义方法参数

直接用ValueTuple作为IGrouping的键类型:

public void DoSomethingB(List<IGrouping<(string DocumentType, int Id), Document>> groupedDocuments)
{
    // 示例操作:遍历所有分组
    foreach (var group in groupedDocuments)
    {
        // 获取分组键的属性
        string type = group.Key.DocumentType;
        int id = group.Key.Id;
        
        // 遍历组内的文档
        foreach (Document doc in group)
        {
            // 处理文档逻辑
            Console.WriteLine($"分组:{type}-{id},描述:{doc.Description}");
        }
    }
}

方式二:自定义分组键类

如果需要更复杂的分组逻辑或类型语义,可以定义一个具名类作为分组键,注意必须重写Equals和GetHashCode保证分组正确性:

1. 定义分组键类

public class DocumentGroupKey
{
    public string DocumentType { get; set; }
    public int Id { get; set; }

    // 重写相等性判断方法
    public override bool Equals(object obj)
    {
        return obj is DocumentGroupKey key &&
               DocumentType == key.DocumentType &&
               Id == key.Id;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(DocumentType, Id);
    }
}

2. 修改分组逻辑

var groupedDocuments = Documents.GroupBy(item => new DocumentGroupKey 
{ 
    DocumentType = item.DocumentType, 
    Id = item.Id 
}).ToList();

3. 定义方法参数

public void DoSomethingB(List<IGrouping<DocumentGroupKey, Document>> groupedDocuments)
{
    foreach (var group in groupedDocuments)
    {
        DocumentGroupKey key = group.Key;
        foreach (Document doc in group)
        {
            // 处理逻辑
        }
    }
}

内容的提问来源于stack exchange,提问作者zielu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:32:54