【问题标题】:Why Lambda expression returns System.Linq.Enumerable+WhereSelectEnumerableIterator`2 as a result为什么 Lambda 表达式会返回 System.Linq.Enumerable+WhereSelectEnumerableIterator`2 作为结果
【发布时间】:2019-07-20 21:37:21
【问题描述】:

我在使用 lambda 表达式返回字符串列表时得到以下字符串:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[HOrg.ServiceCatalog.Contracts.Models.IOfferProperty,System.String]

我的代码是:

    IList<string> offerIds = new List<string>();
    foreach (var offer in offerProperties)
    {
       offerIds.Add(offer
         .Where(x => x.PropertyDefinitionId == propertyDefinitionId)
         .Select(x => x.OfferId)
         .ToString());
    }

在 foreach 循环中,offer 变量包含预期值。但是当我使用 lambda 表达式创建条件时,它会返回 System.Linq.Enumerable+WhereSelectEnumerableIterator`2 作为结果。

当我搜索这个时,我得到了一些建议,例如,

  1. 将 lambda 表达式的结果复制到单独的列表中
  2. ToList() 用于 lambda 表达式,然后将其分配给结果变量

还有更多建议。但是没有答案对我有帮助。

有人知道这段代码有什么问题吗?

【问题讨论】:

  • Join序列的所有项:string.Join("; ", offer.Where. ... .Select(x =&gt; x.OfferId))
  • 你应该意识到这是在一个没有覆盖来自Object的类型上调用ToString默认结果。这意味着它几乎肯定意味着在调试场景之外调用ToString()..

标签: c# .net linq lambda collections


【解决方案1】:

而不是序列转换为String

 // How can .Net convert sequence into string? The only way is to return type name
 // which is unreadable System.Linq.Enumerable+WhereSelectEn... 
 offer
   .Where(x => x.PropertyDefinitionId == propertyDefinitionId)
   .Select(x => x.OfferId)
   .ToString()

Join 将项目转换成string

  // Join items into string with "; " delimiter, e.g. "1; 2; 3; 4"
  offerIds.Add(string.Join("; ", offer
    .Where(x => x.PropertyDefinitionId == propertyDefinitionId)
    .Select(x => x.OfferId)));

【讨论】:

    【解决方案2】:

    如果您希望每个报价都有一个结果,请尝试:

    IList<string> offerIds = new List<string>();
    foreach (var offer in offerProperties)
    {
       offerIds.Add(offer.Where(x => x.PropertyDefinitionId == propertyDefinitionId).Select(x => x.OfferId).FirstOrDefault()?.ToString());
    }
    

    【讨论】:

    • 最好建议:offer.FirstOrDefault(x =&gt; x.PropertyDefinitionId == propertyDefinitionId)?.OfferId.ToString()
    • 我已经尝试了你的建议。甚至所有有效记录也返回 null。
    • @novicedeveloper - 我们无权访问您的代码或数据。除非您向我们提供更多信息,否则没有人可以为您提供经过测试的可行的解决方案。一个好的开始是minimal reproducible example 并清楚地描述代码意味着要实现的目标
    【解决方案3】:

    在我看来,您希望将 offerIds 集合作为字符串,其中多个附加到 offerproperties。

    如果是这样,那么您正在寻找 addrange 函数。还要将您的 ToString() 调用移动到 select 语句中,而不是在它之后。

    IList<string> offerIds = new List<string>();
    foreach (var offer in offerProperties)
    {
        offerIds.AddRange(offer.Where(x => x.PropertyDefinitionId == propertyDefinitionId).Select(x => x.OfferId.ToString()));
    }
    

    现在对于每个报价,都会将一组 OfferId 字符串添加到您的报价 IList 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2017-11-27
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多