【问题标题】:Converting an object T into a List<T> in C#在 C# 中将对象 T 转换为 List<T>
【发布时间】:2011-08-05 12:49:03
【问题描述】:

我有一个关于铸造类型的愚蠢但令人费解的问题。正如您从代码中看到的那样,我有一个变量 lprod_monthylReport,根据 ytm 的值可以是 List&lt;Monthly_Report&gt; 或只是 Monthly_Report。在这两种情况下,我都需要变量具有相同的名称。

var lprod_monthlyReport = new List<Monthly_Report>;

if (ytm == true)
{
   lprod_monthlyReport = _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID);
}
else
   lprod_monthlyReport = _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID);

问题是,如果我在每个 if(或 else)部分中声明变量,编译器会给出错误,因为它表示该变量已在此上下文中声明。

我已经尝试过投射

lprod_monthlyReport = (Monthly_Report) _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.Item_ID);

但它不起作用。我也尝试了 as 关键字但没有成功。

你能帮我解决这个问题吗?谢谢

弗朗西斯科

【问题讨论】:

  • GetSpecificArchiveReport 和 GetSpecificYTMReport 返回什么类型
  • 为什么lprod_monthlyReport必须成为List&lt;Monthly_Report&gt;,而不是你的方法返回什么?
  • @Hath:感谢您的回答。 GetSpecificArchiveReport 返回一个 Monthly_Report 对象(它使用 Single 进行 LINQ 查询) GetSpecificYTMReport 返回一个 List(使用 Where 的 LINQ 查询)。
  • @Rowland Shaw:感谢您的回答。注意这两种方法是不同的,不仅仅是签名

标签: c# .net generics collections casting


【解决方案1】:

这应该有效: 如果您有 Monthly_Report,只需将其添加到列表中...

    List<Monthly_Report> lprod_monthlyReport;
    if (ytm == true)
    {
       lprod_monthlyReport  = new List<Monthly_Report>();
       lprod_monthlyReport.add(_ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID));
    }
    else{
       lprod_monthlyReport = _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID));
    }

【讨论】:

  • 天才,这就是我要找的!非常感谢。其实我想做一个小小的改进。您可以在开头声明 var lprod_monthlyReport = new List(); 并将其从 if 块中取出。否则 else 块将不起作用
  • @Francesco:如果你从 `GetSpecificYTMReport()' 得到一个List&lt;Monthly_Report&gt;,为什么它不能工作?
  • 请原谅它有效。你能解释一下为什么你在 if 中实例化对象而不是在声明它时实例化它吗?
【解决方案2】:

第一行代码

var lprod_monthlyReport = new List<Monthly_Report>;

表示变量的类型为List&lt;Monthly_Report&gt;,因此它不能包含单个Monthly_Report 对象。

此代码应重构为以不同的方式工作,或者让一个方法返回一个List&lt;Monthly_Report&gt;,其中只有一个Monthly_Report

【讨论】:

  • 感谢您的回答。请注意,这两种方法是不同的。一个返回 List 另一个返回 Monthly_Report
【解决方案3】:

var 关键字的重要之处在于它并不意味着“变体”。 var 用于编译器的类型推断,这意味着您声明的位置:

var something = new List<Something>();

...您正在声明List&lt;Something&gt; 类型的东西。这意味着你不能这样做:

something = new Something();

...因为您已经将其声明为其他内容。从可用性的角度来看,var 是语法糖。编译器(和 Visual Studio 智能感知引擎)使用类型推断来知道 something 实际上是 List&lt;Something&gt;

【讨论】:

    【解决方案4】:

    这是行不通的,唉。

    但是,如果您愿意,您也可以将单个实例包装到一个列表中。然后,您只需让您的代码处理一个或多个 Monthly_Report 项目中的 List&lt;Monthly_Report&gt;

    【讨论】:

      【解决方案5】:

      lprod_monthlyReport 声明为“对象”。 Monthly_ReportList&lt;Monthly_Report&gt;之间没有is关系。

      当你开始使用“lprod_monthlyReport”时你会遇到问题,因为你不知道它是什么类型,除了对象,'is'关键字可以帮助你。

      考虑一下并考虑重构您的代码。

      【讨论】:

      • 不适用,因为那时我需要查询变量。如果我将它们声明为对象,编译器将找不到查询方法
      【解决方案6】:

      试试这个

      List<Monthly_Report> lprod_monthlyReport;
      
      if (ytm == true) 
      {
          lprod_monthlyReport = _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID);
      } 
      else
      { 
         lprod_monthlyReport = new List<Monthly_Report>() 
          {
             _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID)
          };
      }
      

      【讨论】:

      • 那不会编译,你不能稍后再分配var的类型。
      • 感谢您的回答。但是,您不能在不进行赋值的情况下声明 var 变量。
      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2021-11-26
      • 2021-12-02
      相关资源
      最近更新 更多