如何将List <t> var设置为null

时间:2018-10-19 07:46:46

标签: c# asp.net

因为我最终需要在屏幕上显示,所以该字段是过滤后的字段。

我不想使用new ListLSDnew ListMPS等。

我需要共享变量new List

[Serializable]
public class DiseasesDataInfo
{
    public String FAB { set; get; }
    public String GAA { set; get; }
    /* ... */
}

var newList = null; // Can't be set to null?

switch (ddlDiseases.SelectedValue)
{
      case DiseasesCollections.LSD:
           newList = ImportExcleInfoList.Select(x => new
           {
              x.GAA, x.GAAratio, x.GAAInhibition, x.GAAStatus,
              x.FAB, x.FABratio, x.FABStatus,
              x.GD, x.GDratio
           }).ToList();

           gvAdvanced.DataSource = newList;
           break;
    // etc.
}

gvAdvanced.DataBind();

6 个答案:

答案 0 :(得分:2)

您不能将var用作null。您必须指定类型,因为编译器无法推断出它。在Linq查询中创建匿名类型时,您可能必须使用类似以下内容的方法:

IList newList = null;
switch (ddlDiseases.SelectedValue)
{
    case DiseasesCollections.LSD:
       newList = ImportExcleInfoList.Select(x => new
       {
          x.GAA, x.GAAratio, x.GAAInhibition, x.GAAStatus,
          x.FAB, x.FABratio, x.FABStatus,
          x.GD, x.GDratio
       }).ToList();
       gvAdvanced.DataSource = newList;
       break;
   // etc.
}

似乎您也可以创建指定类的实例:

IList<DiseasesDataInfo> newList = null;
// [...]
newList = ImportExcleInfoList.Select(x => new DiseasesDataInfo { GAA = x.GAA /* ... */}).ToList();
gvAdvanced.DataSource = newList;

如果在切换块之外的其他地方不需要newList,也可以直接分配结果:

gvAdvanced.DataSource = ImportExcleInfoList.Select(x => new DiseasesDataInfo { GAA = x.GAA /* ... */}).ToList();

答案 1 :(得分:2)

在变量的使用范围之外声明变量,或者对不同的作业使用相同的变量是一个坏主意。在这种情况下,变量的值一次 not 不在单个[DataMember] public Int32 RequestId { get { return requestId; } set { requestId = value; } } [DataMember] public string StatusCode { get { return statusCode; } set { statusCode = value; } } [DataMember] public List<string> ErrorMessages { get { return errorMessages; } set { errorMessages = value; } } [DataMember] public string PeriodStatus { get { return status; } set { status = value; } } [DataMember] public string PhoneNumber { get { return status; } set { status = value; } } 块之外使用。应该在每个case块中同时声明和分配该变量,例如:

case

列表也可以直接分配给switch (ddlDiseases.SelectedValue) { case DiseasesCollections.LSD: var lsdList = ImportExcleInfoList.Select(x => new { x.GAA, x.GAAratio, x.GAAInhibition, x.GAAStatus, x.FAB, x.FABratio, x.FABStatus, x.GD, x.GDratio }).ToList(); gvAdvanced.DataSource = lsdList; break; case DiseasesCollections.MPS: var mspList = ImportExcleInfoList.Select(x => new { x.MPS2, x.MPS2ratio, x.MPS2Status, x.MPS3B, x.MPS3Bratio, x.MPS3BStatus }).ToList(); gvAdvanced.DataSource = mpsList; break; } gvAdvanced.DataBind();

gvAdvanced.DataSource

答案 2 :(得分:1)

您可以将var设置为null,因为C#是强类型的。引入var是为了允许我们为引用分配匿名类型,尽管我们可以将var与其他数据类型一起使用,只要编译器可以解析var应该是的类型即可。这就是为什么我们不能这样做:

var v;

由于编译器不知道var是什么,在以下情况下,编译器将确定var实际上是string

var s = "";

在您的情况下,将var设置为null是编译器无法解决的,因为它可能是任何采用null值(即任何引用类型)的东西,编译器不知道您想要一个列表,而是应该使用一个空列表:

var myList = new List<T>();
myList = null;

或者更好,只需声明一下即可:

List<T> myList = null;

供参考,var的使用方式如下,以下是一个匿名类型,我们必须使用var来使用分配和引用:

var anon = new { name = "", description = "" };

答案 3 :(得分:1)

虽然我不建议这样做,因为我更喜欢使用模型而不是匿名类型,但是您可以通过执行以下操作来实现它:

object newList = null; // Use object. Grid datasource accepts object
switch (ddlDiseases.SelectedValue)
{
    case DiseasesCollections.LSD:
         newList = ImportExcleInfoList.Select(x => new
         {
              x.GAA, x.GAAratio, x.GAAInhibition, x.GAAStatus,
              x.FAB, x.FABratio, x.FABStatus,
              x.GD, x.GDratio
           }).ToList();

           break;

      case DiseasesCollections.MPS:
           newList = ImportExcleInfoList.Select(x => new
           {
             x.MPS2, x.MPS2ratio, x.MPS2Status,
             x.MPS3B, x.MPS3Bratio, x.MPS3BStatus
           }).ToList();

           break;
           }

     //****** case DiseasesCollections.Other...
gvAdvanced.DataSource = newList; //Set new list here instead on every case.
gvAdvanced.DataBind();

答案 4 :(得分:0)

您可以使用dynamic类型,这将允许您在运行时确定newList的类型:

dynamic newList = null;
...
newList = ImportExcleInfoList.Select(x => new
{
    x.GAA, x.GAAratio, x.GAAInhibition, x.GAAStatus,
    x.FAB, x.FABratio, x.FABStatus,
    x.GD, x.GDratio
}).ToList();
...
gvAdvanced.DataSource = newList;

它基本上告诉编译器newList类型未知,并且可能会随着时间变化。

答案 5 :(得分:-1)

将列表初始化更改为以下内容:

List<DiseasesDataInfo> newList = null;

这应该有效。问题是您使用的是var关键字。