从通用列表中删除属性/列

时间:2012-02-02 10:24:54

标签: c# linq list generics

由于某种原因,我无法更改查询,所以我必须在C#中执行此操作。

我有一个班级:

public class myClass
{
    int id { get; set; }
    string name { get; set; }
    DateTime sDate { get; set; }
    bool status { get; set; } 
}

我收到的数据将在此列表中获取。现在我想要的是从具有null值的列表中删除这些属性。我听起来很疯狂,但你读得对。我想到只创建一个只包含所选属性的列表,但上述任何属性都可以是null。所以我必须设计一种基于此过滤我的列表的机制。

为了更加清晰,请考虑以下示例。

List<myClass> lstClass = some data source.

获取数据后,通用列表(lstClass)看起来像这样。考虑表中的结果集:

Id Name Sdate status
1  a    null  null
2  b    null  null
3  c    null  false

我可以在删除属性sdate之后如何使我的列表看起来像这样。 所以我想要创建的新列表应该只有三个属性。

Id Name status
1  a    null
2  b    null
3  c    false

有什么想法吗?我可以使用Linq吗?

PS:这与演示文稿无关。我没有网格,我无法隐藏不是我想要的列。

2 个答案:

答案 0 :(得分:18)

假设您有一个myClass实例的通用列表,您可以创建一个只包含所需属性的匿名类型:

List<myClass> list = ...;
var reducedList = list.Select(e => new {e.id, e.name, e.status}).ToList();
// note: call to ToList() is optional

foreach (var item in reducedList)
{
    Console.WriteLine(item.id + " " + item.name + " " + item.status);
    //note: item does not have a property "sDate"
}

答案 1 :(得分:0)

我不确定你应该在数据中解决你的问题,而是一个演示问题。 您想在哪个控件中显示它?假设您使用AutoGenerateColumns = True在DataGrid中显示它,然后您可以1)为每个列/属性循环列/属性2)查看所有行的所有属性值是否为null,如果是,则将列的可见性设置为Collapsed。 如果您自己生成列,则更简单:只有当内容对于所有行都不为null时才添加列 如果您的数据库内容是动态的,您可能希望将每行的可见性绑定到一个属性,该属性将表明所有行都为null或不属于该属性。根据您希望代码的通用程度,代码可能会有很大差异,如果您想要通用解决方案,使用Reflection来检索/获取/设置属性可能会有所帮助。