Linq Query 和 String.Join 的泛型返回类型使用不当

本文关键字:泛型 返回类型 使用不当 Join Query String Linq | 更新日期: 2023-09-27 18:15:40

EDIT给出解决方案后的总结

*Linq 查询结果几乎总是以">var"隐式类型或类型化的 IENumerable>(如 IEnumerable(呈现。然而,简单更通用的IEnumerable就足够了

*String.Join(( 没有针对 IEnumerable 的专用

化(但自然有一个专门用于 IEnumerable 的专用化(,并回退到 String.Join 方法 (String, Object[] ...(。然后,它假定 linq 查询结果 res 是大小为 1 的对象数组。我不知道为什么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++,我相信我能够处理"更高"类的任何"对象组"。

知道如何正确实现这一目标吗?

Linq Query 和 String.Join 的泛型返回类型使用不当

在这种情况下,

如果在调用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);

生成IEnumerableToString方法被调用,这就是"System.Linq.Enumerable+WhereArrayIterator'1[System.Int32]"的来源。您可以通过自己创建object[]并将其传递给string.Join来克服此行为。

您也可以使用

string.Join(", ", res.Cast<object>());

这将解析为不同的 string.Join 重载,该重载在输入序列的每个元素上调用ToString