不带某些字段的对象的 C# 迭代列表

本文关键字:对象 迭代 列表 字段 | 更新日期: 2023-09-27 18:33:21

如何迭代只有四个字段中两个的对象的List<>?下面的代码到目前为止有效,但是在 C# 中是否有更简单的方法可以做到这一点?

using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    class Program
    {
        private static void Main()
        {
            var list = new List<Employee>
            {
                new Employee("A", 32, 5235.32, 2004, 3, 2),
                new Employee("B", 28, 1435.43, 2011, 11, 23),
                new Employee("C", 47, 3416.49, 1997, 5, 17),
                new Employee("D", 22),
                new Employee("E", 57)
            };
            list.ForEach(l => {
                if (l.Salary == 0) Console.WriteLine(" {0} {1}", l.Name, l.Age);
            });
        }
    }
}

不带某些字段的对象的 C# 迭代列表

看起来您只是想从集合中过滤项目 - 您正在做的事情工作正常,但它(可以说)更习惯地写成:

foreach(var l in list.Where(x => x.Salary == 0))
{
    Console.WriteLine(" {0} {1}", l.Name, l.Age);
}

最简单的方法是使字段可为空。

class Employee
{
    // strings are nullable
    public string Name { get; set; }
    // this allows double values to be nullable (the ? at the end)
    public double? Salary { get; set; }
    public double? Double1 { get; set; }
}

然后,当您查询时

var list = new List<Employee>();
// You can filter your list with Where() on if values have a value set or not
list.Where(x=> x.Salary.HasValue == false).ToList().ForEach( .. )

有关使用可为空 https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx 的信息

反射可以帮助您获得仅有的前 2 个字段,因为仅填充 2 个字段的唯一情况是名称和年龄的情况,那么这将对您有所帮助:

list.Where(l => l.GetType().GetProperties().Count(e => e.GetValue(e)!=null) == 2).ToList().ForEach(l => 
{
     Console.WriteLine(" {0} {1}", l.Name, l.Age);
});