【问题标题】:Remove a property/column from a generic list从通用列表中删除属性/列
【发布时间】:2012-02-02 10:24:53
【问题描述】:

由于某种原因,我无法更改查询,所以我必须在 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:这与演示无关。我没有无法隐藏不是我要查找的列的网格。

【问题讨论】:

  • 您的问题非常不清楚 - 结果是您在谈论什么样的列表并不明显。如果您使 C# 代码有效并使其遵循 .NET 命名约定,这也会有所帮助。
  • 这肯定与您如何显示给定数据有关,而不是您拥有什么数据?
  • 我将编辑帖子,关于命名约定,我准备了一个虚拟示例来反映场景。

标签: c# linq list generics


【解决方案1】:

假设您有一个 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"
}

【讨论】:

  • @M4N 但我不知道哪一列会是空白的,所以我不能硬连接它。您能否提供一个示例,您首先确定必须在匿名类中传递的列名块。
【解决方案2】:

我不确定您是否应该在数据中解决您的问题,但这是一个演示问题。 您想在哪个控件中显示它?假设您使用 AutoGenerateColumns=True 在 DataGrid 中显示它,那么您可以 1) 在列/属性上循环 2) 对于每个列/属性,查看所有行的所有属性值是否为空,如果是,则将列的可见性设置为折叠。 如果您自己生成列,则更简单:仅当所有行的内容不为空时才添加列。
如果您的数据库内容是动态的,您可能希望将每一行的可见性绑定到一个属性,该属性将声明该属性的所有行是否为空。根据您希望代码的通用程度,代码可能会有很大不同,如果您想要通用解决方案,使用反射来检索/获取/设置属性可能会有一些用处。

【讨论】:

  • 您倾听他人建议以寻求解决方案的能力令人印象深刻。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2020-09-23
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多