无法转换类型为WhereSelectListIterator 2 System.Collections.Generic.List的对象

Ayd*_*yed 9 linq

我正在处理这些列表,以获得与组合框中所选项目匹配的项目.

private void InitializaMessageElement()
{
    if (_selectedTransactionWsName != null)
    {
Run Code Online (Sandbox Code Playgroud)
  1. 获取与下拉列表中所选项目匹配的事务Web服务名称,输出= TestWS,这是正确的

    var getTranTypeWsName = TransactionTypeVModel
         .GetAllTransactionTypes()
         .FirstOrDefault(transTypes => 
                 transTypes.WsMethodName == _selectedTransactionWsName);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从treenode列表中循环wsnames列表.在这里它给了我所有正确的节点.

    var wsNameList = MessageElementVModel
         .GetAllTreeNodes().Select(ame => 
                 ame.Children).ToList();//. == getTranTypeWsName.WsMethodName);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在wsNameList中找到getTranTypeWsName.WsMethodName.这是我遇到问题的地方:

          var msgElementList = wsNameList.Select(x => x.Where(ame => getTranTypeWsName != null && ame.Name == getTranTypeWsName.WsMethodName)).ToList();
    
    Run Code Online (Sandbox Code Playgroud)

我的MsgElement列表:

    MsgElementObsList = new ObservableCollection<MessageElementViewModel>(msgElementList);
    this.messageElements = _msgElementList;
    NotifyPropertyChanged("MessageElements");
}
Run Code Online (Sandbox Code Playgroud)

这里抛出了施法错误.为什么不工作?我是LINQ的新手.谢谢

SLa*_*aks 15

正如错误试图告诉你的那样,LINQ方法返回特殊的迭代器类型实现IEnumerable<T>; 他们不回来List<T>.
这可以实现延迟执行.

由于对象实际上不是a List<T>,因此无法将其强制转换为不属于的类型.

如果你需要一个List<T>,你可以调用ToList(),或完全跳过LINQ并使用List<T>.ConvertAll(),就像Select(),但确实返回List<T>.

  • @AydaSayed:您需要在要用作列表的对象上调用`ToList()`。 (2认同)