【问题标题】:What is wrong in this LINQ Query, getting compile error此 LINQ 查询有什么问题,出现编译错误
【发布时间】:2012-10-12 05:43:26
【问题描述】:

我有一个列表AllIDs

List<IAddress> AllIDs = new List<IAddress>();

我想根据字符“_”对成员字段AddressId 进行substring 操作。

我正在使用以下 LINQ 查询,但出现编译错误:

AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_"))
    .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_")))
    .ToList();

错误:

无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List

【问题讨论】:

    标签: string linq list


    【解决方案1】:

    AllIDsIAddress 的列表,但您选择的是string。编译器抱怨它无法将List&lt;string&gt; 转换为List&lt;IAddress&gt;。您的意思是以下吗?

    var substrings = AllIDs.Where(...).Select(...).ToList();
    

    【讨论】:

    • 但问题是我想提供结果列表作为下拉列表的数据源。并且结果列表没有属性 AddressID。
    【解决方案2】:

    如果你想把它们放回Address 对象(假设你有一个Address 类除了你的IAddress 接口),你可以做这样的事情(假设Address 的构造函数在地点):

    AllIDs = AllIDs.Where(...).Select(new Address(s.AddressID.Substring(s.AddressID.IndexOf("_")))).ToList();
    

    您还应该考虑使用 LINQ 的查询语法而不是方法语法,它可以清理和提高很多这样的查询的可读性。您的原始(未修改)查询大致相当于:

    var substrings = from a in AllIDs
                     let id = a.AddressId
                     let idx = id.IndexOf("_")
                     where id.Length >= idx
                     select id.Substring(idx);
    

    虽然这实际上只是一个风格的东西,而且它编译成与原版相同的东西。一个细微的区别是,您只需为每个条目调用 String.IndexOf() 一个,而不是每个条目两次。 let 是你的朋友。

    【讨论】:

    • 嗨,马修,感谢您的回复。但问题是我想在您的示例子字符串中提供结果列表作为下拉列表的数据源。并且结果列表将不具有如下使用的属性 AddressID。 ddl.DataSource = AllIDs; ddl.DataTextField = "地址ID"; ddl.DataValueField = "地址ID"; ddl.DataBind();我可以使用 ForEach,但想使用 LINQ。有什么指点吗??
    • 看看 wasp 的解决方案,它应该适用于这个数据绑定。
    【解决方案3】:

    也许是这个?

    var boundable  = 
        from s id in AllIDs
        where s.AddressId.Length >= s.AddressId.IndexOf("_")
        select new { AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_")) };
    boundable = boundable.ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2015-06-29
      • 2013-08-14
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多