无法将类型 'System.Collections.Generic.List<object>' 隐式转换为 'System.Collections.Generic.IEnumerable<int>

Cannot implicitly convert type 'System.Collections.Generic.List<object>' to 'System.Collections.Generic.IEnumerable<int>

我想构建一个函数,该函数接受 non-negative 个整数和字符串的列表以及 returns 一个过滤掉字符串的新列表。

与此类似:

ListFilterer.GetIntegersFromList(new List<object>(){1, 2, "a", "b"}) => {1, 2}
ListFilterer.GetIntegersFromList(new List<object>(){1, 2, "a", "b", 0, 15}) => {1, 2, 0, 15}

为此,我做了以下操作:(评论显示了最初的尝试)

using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class ListFilterer
{
   public static IEnumerable<int> GetIntegersFromList(List<object> listOfItems)
   {
     foreach (var item in listOfItems)
     {
       if(item is string)
       {
         listOfItems.Remove(item);
       }
     }
     // return listOfItems; <- Original attempt
     return listOfItems.ToList(); 

   }
}

这给出了标题中的错误:

src/Solution.cs(16,13): error CS0266: Cannot implicitly convert type 'System.Collections.Generic.List<object>' to 'System.Collections.Generic.IEnumerable<int>'. An explicit conversion exists (are you missing a cast?)

所以我添加了我认为正确的转换 .ToList() 但它最终没有做任何事情并且仍然提供相同的错误。我对此感到困惑,因为在搜索和查看我认为类似的问题后,我仍然没有找到正确的方法来转换它,并且由于我对 Linq 和 Enumerable 的东西缺乏经验,我不确定去哪里看。

如有任何帮助,我们将不胜感激,感谢您的宝贵时间

您是否正在寻找:

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

错误是因为您已经从列表中删除了所有字符串,但列表的数据类型仍然是对象。即使您已从中删除了所有字符串,您的 List<object> 仍然可以在其中添加其他数据类型的值。简而言之,即使您删除了字符串,但列表的基础数据类型仍然是对象。在 C# 中,对象是基础 class,对象可以有整数,但其他方式是不可能的。这就是为什么 c# 给你这个错误。

我的解决方案是:

 //Assuming listOfItems only contains strings and ints. 
 //If other datatypes are there then you have to do int.tryparse to check 
 //whether the current list item can be converted to int and then add that to nums.
 public static IEnumerable<int> GetIntegersFromList(List<object> listOfItems)
 {
     List<int> nums = new List<int>();
     foreach (var item in listOfItems)
     {
        if (!(item is string))
        {
           nums.Add(Convert.ToInt32(item));
        }
     }
     // return listOfItems; <- Original attempt
     return nums;

 }