如何在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
相关产品推荐
相关产品推荐

