Linq Query 和 String.Join 的泛型返回类型使用不当
本文关键字:泛型 返回类型 使用不当 Join Query String Linq | 更新日期: 2023-09-27 18:15:40
EDIT给出解决方案后的总结
*Linq 查询结果几乎总是以">var"隐式类型或类型化的 IENumerable
化(但自然有一个专门用于 IEnumerable
/编辑
我曾想象过可以编写通用的 linq 查询返回类型。第一个想法是编写这样的代码:
class exLinq
{
Func<IEnumerable>[] fun_list = new Func<IEnumerable>[]
{ () => { int[] data = { 1, 2, 5, 8, 11 };
var result = from d in data
where 0 == d % 2
select d;
return result;
}
//() => Other queries that could be on string, double... collections
};
static void Main(string args[])
{
foreach (var fun in fun_list)
{
var f = fun;
var res = f();
Console.WriteLine(String.Join(", ",res));
}
}
}
但是我得到了结果
System.Linq.Enumerable+WhereArrayIterator'1[System.Int32]
我的 linq 查询返回类型与 IEnumerable
到目前为止,我通过修改获得了正确的代码输出
if ( res is IEnumerable<int>)
Console.WriteLine(String.Join(", ",res.Cast<int>()));
2, 8
更习惯于C++,我相信我能够处理"更高"类的任何"对象组"。
知道如何正确实现这一目标吗?
如果在调用string.Join
之前将每个可枚举对象转换为object[]
,则可以执行此操作:
foreach (var fun in fun_list)
{
var f = fun;
var res = f();
Console.WriteLine(String.Join(", ",res.Cast<object>().ToArray()));
}
您看到此行为的原因是
string.Join(", ", res);
称之为string.Join
的重载。最后一个数组参数上的params
修饰符允许使用任意数量的参数调用它,例如
string.Join(", ", 1, 2, 3);
这些参数中的每一个都会添加到传递给方法的object[]
中。Join
方法对数组中的每个元素调用 ToString
以将其格式化为输出字符串。
这意味着当您致电时
string.Join(", ", res);
生成IEnumerable
的ToString
方法被调用,这就是"System.Linq.Enumerable+WhereArrayIterator'1[System.Int32]"的来源。您可以通过自己创建object[]
并将其传递给string.Join
来克服此行为。
您也可以使用
string.Join(", ", res.Cast<object>());
这将解析为不同的 string.Join
重载,该重载在输入序列的每个元素上调用ToString
。