合并两个C#匿名类型数组遇CS1929错误,求解决方案
解决C#集合合并时的Concat类型不匹配问题
问题根源
你的代码报错核心是两个查询返回的匿名类型结构不一致:
- 第一个匿名类型属性为
Conn_from、ID_Seal_From - 第二个匿名类型属性为
Conn_to、ID_Seal_To
C#要求匿名类型的属性名称、类型、顺序完全一致才会被视为同一种类型,因此Concat无法在不同类型的集合间执行。
解决方案
方案1:统一匿名类型属性名(推荐)
将两个查询的匿名类型属性名改成完全一致,让C#识别为同类型,即可正常执行Concat。同时用string.IsNullOrEmpty()简化空值判断:
var query = (from el in l where !string.IsNullOrEmpty(el.ID_Seal_From) select new { Conn = el.Conn_from, SealID = el.ID_Seal_From }).ToArray(); var query2 = (from el in l where !string.IsNullOrEmpty(el.ID_Seal_To) select new { Conn = el.Conn_to, SealID = el.ID_Seal_To }).ToArray(); // 现在可正常合并 var res = query.Concat(query2);
方案2:使用自定义实体类型
如果需要保留原属性语义,或后续操作需要明确类型,可定义类/结构体,让两个查询都返回该类型实例:
// 定义自定义类型 public class SealConnection { public string Connection { get; set; } public string SealID { get; set; } } var query = (from el in l where !string.IsNullOrEmpty(el.ID_Seal_From) select new SealConnection { Connection = el.Conn_from, SealID = el.ID_Seal_From }).ToArray(); var query2 = (from el in l where !string.IsNullOrEmpty(el.ID_Seal_To) select new SealConnection { Connection = el.Conn_to, SealID = el.ID_Seal_To }).ToArray(); // 合并操作正常执行 var res = query.Concat(query2);
方案3:延迟枚举(优化性能)
若无需提前转数组,可直接对IEnumerable<T>执行Concat,避免提前枚举集合提升性能:
// 保持为IEnumerable<匿名类型>,不提前ToArray() var query = from el in l where !string.IsNullOrEmpty(el.ID_Seal_From) select new { Conn = el.Conn_from, SealID = el.ID_Seal_From }; var query2 = from el in l where !string.IsNullOrEmpty(el.ID_Seal_To) select new { Conn = el.Conn_to, SealID = el.ID_Seal_To }; // 最后按需转为数组或列表 var res = query.Concat(query2).ToArray();
内容的提问来源于stack exchange,提问作者EliTheKing
相关产品推荐
相关产品推荐

