我有一些代码可以从Excel工作表中读取数据。列入清单。
现在出现了一个用户复制一些有效数据然后将大量行留空的情况。然后再复制有效数据。这会读取很多空行。我正在使用一些旧代码来实现excel read&可能会在其他地方使用,所以我不想搞砸那个。
问题是我在List中有很多对象被初始化但所有值都为null。所以我最终检查了所有attribuets,如果:
if (lstConsolidatedData != null)
{
foreach (var lst in lstConsolidatedData)
{
if(lst.a!=null && lst.b!=null && lst.c!=null //& so on....)
{
//some stuff...
}
}
}
我知道这不是最佳或可维护的方式,因为excel表可以修改&因此,整列列表代码需要再次更改&再次从excel添加或删除单个列。
有没有办法在单个语句中检查lst
内的所有值是否为null?
像lst.all !=null
任何想法,如果不是代码也将对我有用。
请注意lst==null
为false
编辑:使用下面的答案我收到此错误
编辑:
o.GetType().GetProperties().Any(c => c.GetValue(o) == null)
适用于任何 null,但实际上我想要删除所有列中不包含任何数据的行,而不是特定的一列或两列。 o.Item1 != null && ...
也未解决问题,因为名称/列数经常更改。
答案 0 :(得分:3)
您可以使用反射来执行此操作,但请注意,与明确执行相比,它会带来性能损失。
public bool IsAnyPropertyNull(object o)
{
return o.GetType().GetProperties().Any(c => c.GetValue(o) == null);
}
但是,没有内置表达式来减少o.Item1 != null && o.Item2 != null && ...
类型语法。
另外,我假设您所谈论的价值是属性。如果更合适,您也可以使用GetFields
或任何您需要的东西。
答案 1 :(得分:1)
Mathew Huagen指出使用反射获取属性,然后检查它们的值似乎没问题。但是,这有一个很大的警告,即可能有一些你不想被检查的属性。要解决这个问题,您可以将它们放在列表中(如Tim Schmelter所提到的),或者您可以使用自定义属性修饰ConsolidatedData
的所需属性以区分它们:
public class ConsolidatedData
{
public int Id { get; set; }
[NotNull]
public object PropertyOne { get; set; }
[NotNull]
public object PropertyTwo { get; set; }
}
public class NotNull : Attribute { }
当您过滤掉没有NotNull
属性的属性时,检查null是安全的:
ConsolidatedData v = new ConsolidatedData();
bool allNotNull = v.GetType().GetProperties()
.Where(p => null != (Attribute.GetCustomAttribute(p, typeof(NotNull)) as NotNull))
.All(p=>p.GetValue(v) !=null );
此处未检查属性Id
。
答案 2 :(得分:0)
您可以像这样为ConsolidatedData
编写扩展方法;
public static bool IsAnyPropNull(this ConsolidatedData cdata)
{
return cdata.GetType().GetProperties().Any(p => p.GetValue(this) == null);
}
然后,您可以使用单行过滤列表;
var filteredList = lstConsolidatedData.Where(cd => !cd.IsAnyPropNull()).ToList();
这将返回没有空值的所有对象的列表。如果您想要空值,请删除!
,当然。
编辑;
哇,我的答案与Matthew Haugen几乎一样......两者都应该可以正常工作,即使实施略有不同。答案 3 :(得分:0)
我最终深入研究旧代码&在将数据集转换为List之前,我使用代码删除了空行:
//Deleting empty records from Datset
foreach (DataTable source in result.Tables)
{
for (int i = 0; i < source.Rows.Count; i++)
{
DataRow currentRow = source.Rows[i];
bool isEmpty = false;
foreach (var colValue in currentRow.ItemArray)
{
if (!string.IsNullOrEmpty(colValue.ToString()))
{
isEmpty = false;
break;
}
else
isEmpty = true;
}
if (isEmpty)
source.Rows[i].Delete();
}
}
result.AcceptChanges();
不要忘记.AcceptChanges()
,因为它实际上保存了对数据集所做的更改,没有这些更改就不会删除任何记录。