从c#中的集合中删除空列

时间:2013-11-29 13:26:45

标签: c# linq collections expandoobject

我有一个表格菜单,数据就像附加的屏幕截图 Database table

我希望输出如下图所示

http://s16.postimg.org/6evrtzkwl/output.png

表示应隐藏所有空值或整数== 0。

现在我只显示这5列,就像你在第二个屏幕截图中看到的那样..

我有类似的东西..

List<Menu> lstMenus = obj.GetMenus(10);

我的代码是

var menus = new List< dynamic >();

foreach (Menu menuBE in lstMenus)
    {

        dynamic menu = new
        {

            menuBE.MenuID,
            menuBE.ParentMenuID,
            menuBE.LinkText,
            menuBE.ScreenName,
            menuBE.Parameters,
            menuBE.URL
            // if(menuBE.Parameters.Length>0 ){ Parameters = menuBE.Parameters,}
        };
        menus.Add(menu);
    }

我想在foreach循环中添加一些条件,如最后一个注释行。如果menuBE.Parameters.Length>0,那么此参数列应添加到动态菜单中,否则不会。 知道如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

我所理解的,与詹姆斯和詹姆斯相反。 techloverr,你想保留参数为null的记录:

foreach (Menu menuBE in lstMenus){
    if (menuBE.Parameters.Length > 0){
       dynamic menu = new{
           menuBE.MenuID,
           menuBE.ParentMenuID,
           menuBE.LinkText,
           menuBE.ScreenName,
           menuBE.Parameters,
           menuBE.URL
       };
    }
    else {
       dynamic menu = new{
           menuBE.MenuID,
           menuBE.ParentMenuID,
           menuBE.LinkText,
           menuBE.ScreenName,
           menuBE.URL
       };
    }
    menus.Add(menu);
}


** 更新 **

正如我在整个问题中所理解的,当源数据具有Parameters.Lenght == 0时,想要属性Parameters,这就是您使用动态类型的原因。< / p>

不同与“可以有'属性'参数= null'”。如果这是方法,则不需要使用动态类型。只需将项添加为声明的强类型变量或匿名类型的列表项的列表项。

使用dynamic类型,您可以在声明时添加属性。因此,您必须将不同的分配分隔为上面的代码。 如果您想将if放在外面以避免重复代码,请使用ExpandoObject:

var m = new List<System.Dynamic.ExpandoObject>();
foreach (string item in new string[] { "a", "b", "c" }) {
    dynamic menuItem = new System.Dynamic.ExpandoObject();

    menuItem.pos1 = item;
    menuItem.pos2 = (item == "b" ? item : null); // wrong

    if (item == "c") {           // correct
        menuItem.pos3 = "I am at third iteration";
    }

    m.Add(menuItem);
}

请参阅,如果您在m.Add(menuItem);处设置断点,则结果如下:
案例项目==“a”:

menuItem.pos1 = "a";
menuItem.pos2 = null; // wrong: pos2 must not exists

案例项目==“b”:

menuItem.pos1 = "b";
menuItem.pos2 = "b";

案例项目==“c”:

menuItem.pos1 = "c";
menuItem.pos2 = null; // wrong: pos2 must not exists
menuItem.pos3 = "I am at third iteration"; // correct: pos3 only exists here.

答案 1 :(得分:-1)

您可以使用此代码段

  foreach (Menu menuBE in lstMenus)
    {

        dynamic menu = new
        {

          MenuID = menuBE.MenuID,
          ParentMenuID =  menuBE.ParentMenuID,
          LinkText =  menuBE.LinkText,
          ScreenName = menuBE.ScreenName,

          URL = menuBE.URL,
            Parameters = (menuBE.Parameters.Length>0) ? menuBE.Parameters : null
        };
        menus.Add(menu);
    }