【问题标题】:How to assign an ienumerable object to a list in C#如何将可枚举对象分配给 C# 中的列表
【发布时间】:2012-02-12 03:42:33
【问题描述】:

我有一个返回 Ienumerable 对象的方法(方法 A)。

该对象是具有以下字段的数据合同类:

Id
TotalViews

我有另一个调用方法 A 的方法(方法 B)

方法A如下:

List<string> response;
  
response = ExecuteRequest(uri).Select(d => new {d.Id, d.TotalViews }).ToList();

我试图将 ienumerable 对象分配给一个列表。

上述方法不起作用,因为我收到错误。

错误

无法将类型 system.collections.generic.list 隐式转换为 system.collections.generic.list

如何将所有 Ienumerable 对象分配给一个列表?

【问题讨论】:

    标签: c#


    【解决方案1】:

    你不能 - 因为结果不是 strings 的列表。

    您可以将其转换为字符串列表,例如

    List<string> response = ExecuteRequest(uri)
                                  .Select(d => new {d.Id, d.TotalViews }.ToString())
                                  .ToList();
    

    ...但我怀疑那是你真正想要的。你应该问自己:

    • 为什么您最初将response 声明为List&lt;string&gt; 类型?
    • 真正想要什么类型的?
    • 如果您想要一对匿名类型的 Id / TotalViews,有以下三个选项:
      • 如果只需要在方法内强类型,可以坚持匿名类型,用var声明变量
      • 否则...您可以使用IdTotalViews 属性构建您自己的类型...
      • ...如果您使用的是 .NET 4,您可能会使用 Tuple&lt;,&gt;

    这是使用匿名类型的版本:

    // The compiler knows the type of response, but you can't express it in normal
    // C#, because it's IEnumerable<X> where X is the anonymous type... which you
    // can't specify the name of, because it's anonymous...
    var response = ExecuteRequest(uri).Select(d => new {d.Id, d.TotalViews })
                                      .ToList();
    

    【讨论】:

      【解决方案2】:

      您正在尝试将由 d.Idd.TotalViews 组成的匿名类型填充到字符串列表中。

      要么在对结果调用ToList 之前从这两个字符串中创建一个字符串,要么为这些创建一个包含类并制作一个列表而不是String

      public class TotalViewsPerId
      {
        public int Id {get;set;}
        public int TotalViews {get;set;}
      }
      
      List<TotalViewsPerId> response = ExecuteRequest(uri)
                                    .Select(d => new TotalViewsPerId{d.Id, d.TotalViews })
                                    .ToList();
      

      【讨论】:

        【解决方案3】:

        您已声明一个字符串列表,但您正试图分配一个匿名类型的列表。您可以选择以下选项之一:

        • 更改声明以匹配您尝试分配的类型(在本例中为匿名类型):

          var response = ExecuteRequest(uri).Select(d => new {d.Id, d.TotalViews }).ToList();
          

        请注意,您不能从方法中返回匿名类型。

        • 更改您尝试分配的类型以匹配声明(在本例中为List&lt;string&gt;):

          response = ExecuteRequest(uri).Select(d =>
                  string.Format("{0} {1}", d.Id, d.TotalViews)
              ).ToList();
          
        • 更改两者。也许Dictionary&lt;int, int&gt; 会更好地满足您的需求?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 2014-09-20
          • 2022-08-08
          • 2014-05-06
          • 2016-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多