C#中如何正确将IEnumerable<string>转换为string类型?
问题原因
- 直接对LINQ查询返回的
IEnumerable<string>迭代器调用ToString():LINQ的延迟执行迭代器没有重写ToString()方法,默认返回类型的全限定名,就是你看到的System.Linq.Enumerable+SelectArrayIterator开头的输出。 - 直接调用
FirstOrDefault()得到的所有记录值相同:你的代码没有写两个Dal对象数组的关联匹配条件,遍历source1的每一条记录时,都是对整个source2集合取第一个元素,没有筛选当前source1记录对应的source2数据,自然所有行的返回值完全一致。
正确实现方式
根据你的业务关联关系,选择对应的实现逻辑:
场景1:单条source1对应单条匹配的source2(一对一关联)
先根据两个集合的关联键(比如外键、业务主键匹配关系)筛选出当前source1记录对应的source2对象,再取Field字段值:
// 注意替换成你实际的关联判断条件,示例里用s1.Id和s2.Source1Id做关联 var queryResult = source1.Select(src => new DataExample() { Id = src.Id, // 匹配不到对应记录时返回空字符串,可根据需求替换默认值 AdditionalField = source2.FirstOrDefault(s2 => s2.Source1Id == src.Id)?.Field ?? string.Empty }).ToList();
场景2:单条source1对应多条source2(一对多关联),需要把所有匹配的Field值拼接为单个字符串
使用string.Join()方法实现IEnumerable<string>到单个字符串的转换,该方法会遍历迭代器取出所有元素,按指定分隔符拼接,不会返回类型名称:
// 注意替换成你实际的关联判断条件 var queryResult = source1.Select(src => new DataExample() { Id = src.Id, // 第一个参数为拼接分隔符,可替换为顿号、换行符等任意需要的符号 AdditionalField = string.Join(",", source2.Where(s2 => s2.Source1Id == src.Id).Select(s2 => s2.Field)) }).ToList();
性能优化提示
如果两个数组的数据量较大,不要在Select里反复遍历source2做匹配,优先使用LINQ的Join(一对一)或GroupJoin(一对多)方法做集合关联,时间复杂度更低:
// 一对一Join示例 var queryResult = source1.Join( source2, s1 => s1.Id, // source1的关联键 s2 => s2.Source1Id, // source2的关联键 (s1, s2) => new DataExample { Id = s1.Id, AdditionalField = s2.Field } ).ToList();
内容的提问来源于stack exchange,提问作者slowpoke
相关产品推荐
相关产品推荐

