EDIT 解决方案后的摘要
* Linq查询结果几乎总是以" var "隐式类型或类型 IENumerable< T> 喜欢 IEnumerable< INT> 。然而,简单的更通用的 IEnumerable 就足够了
* String.Join()没有 IEnumerable 的专门化(但自然有一个用于 IEnumerable< T> )并且回退到 String.Join方法(String,Object [] ...)。然后假设linq查询结果 res 是一个大小为1的Object数组。我不知道为什么IEnumerable没有重载!
/ EDIT
我曾经想过可以编写泛型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&lt; int&gt; (当我这样做时它可以工作)但我想知道我是否可以混合使用相同的数组/列表查询来处理字符串, double 或者无论如何......
到目前为止,我通过修改
获得了正确的代码输出if ( res is IEnumerable<int>)
Console.WriteLine(String.Join(", ",res.Cast<int>()));
2,8
更习惯使用C ++,我相信我能够处理任何&#34;对象组&#34;与&#34;更高&#34;类。
如何正确实现这一点?
答案 0 :(得分:1)
在这种情况下,如果您在调用string.Join
之前将每个可枚举转换为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
的{{3}}。最后一个数组参数上的string.Join(", ", 1, 2, 3);
修饰符允许使用任意数量的参数调用它,例如
object[]
每个参数都会添加到传递给方法的Join
。 ToString
方法在数组中的每个元素上调用string.Join(", ", res);
以在输出字符串中对其进行格式化。
这意味着当您致电
时ToString
调用生成的IEnumerable
的{{1}}方法,即&#34; System.Linq.Enumerable + WhereArrayIterator`1 [System.Int32]&#34;来自。您可以通过自己创建object[]
并将其传递给string.Join
来克服此行为。
您也可以使用
string.Join(", ", res.Cast<object>());
这解析为this overload string.Join
,在输入序列的每个元素上调用ToString
。