基于类对象列表,如何创建有效属性名称列表?

萨克

我有一Data堂课,看起来像下面这样。

public class Data
{
    public string Dt1 { get; set; }
    public string Dt2 { get; set; }
    public string Dt3 { get; set; }
    public string Dt4 { get; set; }
    public string Dt5 { get; set; }
}

以及它的类对象的列表,以及以下示例数据。

var list = new List<Data>
{
    new Data() { Dt1 = "DtA", Dt2 = string.Empty, Dt3 = "-", Dt5 = "DtC" },
    new Data() { Dt1 = "DtB", Dt2 = string.Empty, Dt3 = string.Empty, Dt5 = "-" },
    new Data() { Dt1 = "DtC", Dt2 = "-", Dt5 = "-" },
    new Data() { Dt1 = "DtD", Dt2 = string.Empty, Dt3 = "DtX", Dt5 = string.Empty },
    new Data() { Dt1 = "DtE", Dt3 = "-" }
};

我有一个“无效”字符串的列表,如下所示。

var invalid = new List<string>() { string.Empty, "-", null };

现在,我想从上面的列表中识别出至少包含一个有效字符串的List<string>属性名称,然后使用这些属性名称创建一个如果我们考虑以上示例数据,您会看到,

  • 所有Dt1值均有效。
  • 所有Dt2值均无效。
  • Dt3 具有至少一个有效值。
  • Dt4 永远不会分配,因此所有值均无效。
  • Dt5 具有至少一个有效值。

所以,我的结果列表应该是

Dt1,Dt3,Dt5

我的方法是编写一个函数,该函数标识字符串中是否至少有一个有效值,然后使用该函数检查列表的每个属性。

public static bool IsDataValid(List<string> data, List<string> invalid)
{
    foreach (var item in data)
    {
        if (!invalid.Contains(item))
        {
            return true;
        }
    }
    return false;
}

然后,

var invalid = new List<string>() { string.Empty, "-", null };
var result = new List<string>();
if (IsDataValid(list.Select(x => x.Dt1).ToList(), invalid))
{
    result.Add("Dt1");
}
if (IsDataValid(list.Select(x => x.Dt2).ToList(), invalid))
{
    result.Add("Dt2");
}
if (IsDataValid(list.Select(x => x.Dt3).ToList(), invalid))
{
    result.Add("Dt3");
}
if (IsDataValid(list.Select(x => x.Dt4).ToList(), invalid))
{
    result.Add("Dt4");
}
if (IsDataValid(list.Select(x => x.Dt5).ToList(), invalid))
{
    result.Add("Dt5");
}

当然可以,但是按照我的口味来说有点“丑陋”。另外,我的实际Data班级有20多个属性,因此我不得不使用20条if语句,这又一次带来了不良设计的味道。

我想知道是否还有另一种方法,尤其是不需要“硬编码” if语句的方法。如下所示,我可以迭代该类的属性并从列表中找出哪些是有效的。

foreach (var prop in typeof(Data).GetProperties())
{
    // How do I do a `.Select()` here?
}
数据库

您可以使用Type.GetProperties(),让您的类型,然后使用的所有属性PropertyInfo.NamePropertyInfo.PropertyTypePropertyInfo.GetValue()让每个接口的所有字符串属性的名称和值Data项的收藏。这样,您可以收集具有至少一个有效值的所有属性的名称,如下所示:

public static class ValidationExtensions
{
    public static ICollection<string> ValidProperties<TObject, TValue>(this IEnumerable<TObject> items, Predicate<TValue> isValid)
    {
        var properties = typeof(TObject).GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Where(p => typeof(TValue).IsAssignableFrom(p.PropertyType))
            .Where(p => p.CanRead && p.GetIndexParameters().Length == 0 && p.GetGetMethod() != null)
            .ToList();

        var set = new HashSet<string>();

        foreach (var i in items) // Only iterate through the items once.
            foreach (var p in properties)
            {
                if (set.Contains(p.Name)) // Do not call GetValue() if not necessary, it's expensive.
                    continue;
                if (isValid((TValue)p.GetValue(i)))
                    set.Add(p.Name);
            }

        // Return properties in order
        return properties.Select(p => p.Name).Where(n => set.Contains(n)).ToList();
    }
}

笔记:

演示在这里摆弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建有效的文件扩展名列表

来自分类Dev

创建有角度的用户列表(有效地)

来自分类Dev

如何从字符串创建有效的MYSql数据库名称?

来自分类Dev

如何从字符串创建有效的MYSql数据库名称?

来自分类Dev

如何从字符串创建有效的DateTime对象

来自分类Dev

如何从ALAssetRepresentation创建有效的CGImageSourceRef?

来自分类Dev

如何让打字稿检查有效的对象属性名称

来自分类Dev

如何有效地在通用方法内部创建对象列表?

来自分类Dev

无法创建有效的 URL

来自分类Dev

如何从01开始创建有序列表

来自分类Dev

如何使用angular创建有序列表?

来自分类Dev

如何从01开始创建有序列表

来自分类Dev

Markdown:如何创建有序列表?

来自分类Dev

在没有xts对象的情况下在PortfolioAnalytics中创建有效的边界

来自分类Dev

基于嵌套的if条件创建新列并比较R中列表中的值的有效方法

来自分类Dev

使用自定义属性创建有效的站点地图

来自分类Dev

根据对象属性的最大值合并对象列表的最有效方法

来自分类Dev

根据对象属性的最大值合并对象列表的最有效方法

来自分类Dev

从列表中删除具有空属性的对象的最有效方法

来自分类Dev

如何使用python中的列表列表有效创建摘要数据框

来自分类Dev

如何证明列表拆分有效?

来自分类Dev

如何在没有控制器的情况下创建有效的AuthenticationManager?

来自分类Dev

在执行简单的LEFT JOIN时,如何创建有效的DQL语句以匹配有效的SQL?

来自分类Dev

创建可以无限增长的动态列表属性的内存有效方法

来自分类Dev

如何使用函数为jqGrid editoptions值创建有效的字符串?

来自分类Dev

如何使用PowerShell创建有效的空JSON数组?

来自分类Dev

如何在C中创建有效的选取框函数

来自分类Dev

如何创建有效的无限循环挥动文字动画?

来自分类Dev

如何使用地理库创建有效的Ecto模型变更集?

Related 相关文章

  1. 1

    创建有效的文件扩展名列表

  2. 2

    创建有角度的用户列表(有效地)

  3. 3

    如何从字符串创建有效的MYSql数据库名称?

  4. 4

    如何从字符串创建有效的MYSql数据库名称?

  5. 5

    如何从字符串创建有效的DateTime对象

  6. 6

    如何从ALAssetRepresentation创建有效的CGImageSourceRef?

  7. 7

    如何让打字稿检查有效的对象属性名称

  8. 8

    如何有效地在通用方法内部创建对象列表?

  9. 9

    无法创建有效的 URL

  10. 10

    如何从01开始创建有序列表

  11. 11

    如何使用angular创建有序列表?

  12. 12

    如何从01开始创建有序列表

  13. 13

    Markdown:如何创建有序列表?

  14. 14

    在没有xts对象的情况下在PortfolioAnalytics中创建有效的边界

  15. 15

    基于嵌套的if条件创建新列并比较R中列表中的值的有效方法

  16. 16

    使用自定义属性创建有效的站点地图

  17. 17

    根据对象属性的最大值合并对象列表的最有效方法

  18. 18

    根据对象属性的最大值合并对象列表的最有效方法

  19. 19

    从列表中删除具有空属性的对象的最有效方法

  20. 20

    如何使用python中的列表列表有效创建摘要数据框

  21. 21

    如何证明列表拆分有效?

  22. 22

    如何在没有控制器的情况下创建有效的AuthenticationManager?

  23. 23

    在执行简单的LEFT JOIN时,如何创建有效的DQL语句以匹配有效的SQL?

  24. 24

    创建可以无限增长的动态列表属性的内存有效方法

  25. 25

    如何使用函数为jqGrid editoptions值创建有效的字符串?

  26. 26

    如何使用PowerShell创建有效的空JSON数组?

  27. 27

    如何在C中创建有效的选取框函数

  28. 28

    如何创建有效的无限循环挥动文字动画?

  29. 29

    如何使用地理库创建有效的Ecto模型变更集?

热门标签

归档