是否将可枚举项复制到列表";无法隐式转换类型';MyClass.Items';到';Syste

本文关键字:转换 类型 Syste MyClass Items 复制 枚举 列表 是否 quot | 更新日期: 2023-09-27 18:20:14

这是一个noob问题。所以,如果我错报了这个问题,那是因为我没有完全理解正在发生的事情。

问题

编译错误:无法将类型"MyClass.Items"隐式转换为"System.Collections.Generic.List"

上下文

我正在通过IOrderedEnumerable迭代List,但我无法返回所需的记录,因为它的类型是List(因为我的整个应用程序都在来回传递List对象)。

我对该方法的输入是List,但当我使用OrderBy选项时,它似乎隐式转换为IEnumerable

我已经阅读了我所发现的一切,但这一切似乎都归结为:

// ToList is not available!
return SingleItemToCheck.ToList;

// same type conversion error
List<Items> ReturningList = SingleItemToCheck;

问题代码

public static List<Items> FindCheapestItem(List<Items> source)
{
    // Now we pop only the first one. 
    // ISSUE: Sometimes the top entry on the list is bad, 
    //        so we need to check it!
    var BestItemCandidate = source.OrderBy(s => s.ItemDesirability);
    bool ForgetThisOne = false;
    foreach (var SingleItemToCheck in BestItemCandidate)
    {
        ForgetThisOne = false;
        // ... test for ItemDesirability, truncated
        if (Desirability < 0)
        {
            ForgetThisOne = true;
        }
        if (!ForgetThisOne)
        {
            // we are just returning the first desirable row
            // because we are sorted on desirability
            // and consuming code can only digest a single item.
            return SingleItemToCheck;  // !!! ARGH, compile error !!!
        }
    }
    // means we looped through everything and found nothing of interest
    return null;
}

是否将可枚举项复制到列表";无法隐式转换类型';MyClass.Items';到';Syste

SingleItemToCheck是单个项目,而不是列表。它没有可用的ToList()方法。只需用单个项目创建一个列表。

return new List<Items> { SingleItemToCheck };

或者,如果您只对这一项感兴趣,请将方法的返回类型更改为简单的Items,并完全省略列表。

另一种编写方法,特别是当您只对一个项目感兴趣时,是简单地将内部循环逻辑重构为一个函数,然后编写一个查询

return source
         .OrderBy(s => s.ItemDesirability)
         .Where(s => IsDesirable(s)) // refactored loop logic, returning boolean
         .FirstOrDefault(); // first desirable item, or null

否则,如果你绝对需要一个列表,但其中只有一个项目,请考虑

 var list =  source
         .OrderBy(s => s.ItemDesirability)
         .Where(s => IsDesirable(s))
         .Take(1)
         .ToList();

如果没有元素通过,这将是一个空列表。然后,您可以像现在的代码一样选择返回null,或者返回空列表并让调用方处理它,而不是null结果。