Linq查询和String的通用返回类型。使用不当

时间:2015-10-01 22:41:44

标签: c# linq generics

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;类。

如何正确实现这一点?

1 个答案:

答案 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[]

每个参数都会添加到传递给方法的JoinToString方法在数组中的每个元素上调用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