无法将类型为“ WhereListIterator`1 [System.Object]”的对象转换为类型为“ System.Collections.Generic.IEnumerable`1 [System.Int32]”的对象

问题描述

我正在尝试编写函数以从对象列表中返回所有整数,并且不断得到:“无法转换类型为“ WhereListIterator 1[System.Object]' to type 'System.Collections.Generic.IEnumerable 1 [system.int32]”的对象”。

static void Main(string[] args)
    {
        var list = new List<object>() { 1,2,"a","b" };
        Console.WriteLine(GetIntegersFromList(list));
    }

    public static IEnumerable<int> GetIntegersFromList(List<object> listofItems)
    {
        IEnumerable<int> ints = (IEnumerable<int>) listofItems.Where(x => x is int);
        return ints.ToList();
    }

我尝试过强制转换,而不是强制转换,到处都添加了ToList(),并且总是收到无效的强制转换异常。

输出应为:{1,2}

解决方法

Linq的Where()返回一个WhereListIterator<T>,其中T是源T的{​​{1}},在您的情况下仍然是IEnumerable<T>。 / p>

object之一:

Cast<T>

或者更简短地说,使用OfType<T>()

IEnumerable<int> ints = (IEnumerable<int>)listOfItems.Where(x => x is int).Cast<int>();
,

如果您尝试将整数写入控制台,则需要将IEnumerable转换为string

var list = new List<object>() { 1,2,"a","b" };
Console.WriteLine(string.Join(",",list.OfType<int>()));

// Output: 1,2

或遍历IEnumerable

var list = new List<object>() { 1,"b" };
foreach (int i in list.OfType<int>()) Console.WriteLine(i);

// Output:
// 1
// 2

如果必须实现GetIntegersFromList,则只需创建一个简单的传递即可:

public static IEnumerable<int> GetIntegersFromList(List<object> listOfItems)
    => listOfItems.OfType<int>();

或者如果您不能使用LINQ:

public static IEnumerable<int> GetIntegersFromList(List<object> listOfItems)
{
    foreach (var item in listOfItems)
    {
        if (item is int i) yield return i;
    }
}