检查初始化对象中的所有值是否为null

时间:2014-10-16 06:57:01

标签: c# list null

我有一些代码可以从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==nullfalse

编辑:使用下面的答案我收到此错误

enter image description here

编辑: o.GetType().GetProperties().Any(c => c.GetValue(o) == null)适用于任何 null,但实际上我想要删除所有列中不包含任何数据的行,而不是特定的一列或两列。 o.Item1 != null && ...也未解决问题,因为名称/列数经常更改。

4 个答案:

答案 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(),因为它实际上保存了对数据集所做的更改,没有这些更改就不会删除任何记录。