问题描述
我正在尝试编写函数以从对象列表中返回所有整数,并且不断得到:“无法转换类型为“ 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;
}
}