填充对象的属性而不覆盖它们

本文关键字:覆盖 对象 属性 填充 | 更新日期: 2023-09-27 18:14:25

我已经定义了一个class和一些public属性,我可以获得或设置,例如

public class Employee
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Car { get; set; }
    public string Phone { get; set; }
    public string ID { get; set; }
}

然后我有一个LINQ查询,返回我的员工列表,满足一些条件,所以每个查询可能返回一些员工的列表,例如,同一个人可以有三个电话,所以我得到三行返回的查询结果。

var empRows = LinqQueryToReturnSomeRows();

所以例如:

Hoffman, Mark, BMW, "", ""
Hoffman, Mark, "", "", 56
Hoffman, Mark, Nissan, 7209886985, 78

现在我想做的是能够有一个行为那个人填充数据,如果数据已经从之前的结果填充,那么不要覆盖它所以上面的例子的结果将是:

Hoffman, Mark, BMW, 7209886985, 56

我能做到的算法和方法是什么?

填充对象的属性而不覆盖它们

给定您有empRows的列表,并且它按优先级排序(或者可能这对您无关紧要)。你可以做一些非常简单的事情,比如:

 Employee e = new Employee();
 foreach (var er in empRows)
 {
    e.LastName = string.IsNullOrEmpty(e.LastName) ? er.LastName : e.LastName;
    // ...etc for all the other properties
 }

另一种选择是,您可以将签入属性定义本身,这样您就有了如下内容:

public class Employee
{
    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set 
        {
            if(string.IsNullOrEmpty(_lastName))
            {
                _lastName = value;
            }
        }
    }
}

但我倾向于认为这将是一个痛苦的维护,因为你基本上有一个"写一次"的属性,可能不会明显的其他人使用你的代码。

如果您想要更花哨,您可以使用Aggregate函数做这样的事情:

var e = empRows.Aggregate(new Employee(), (curr,next) => {
    curr.LastName = string.IsNullOrEmpty(curr.LastName) ? next.LastName : curr.LastName;
    // etc
    return curr;
});
private string _LastName;
public string LastName 
{
    get
    {
        if (String.IsNullOrEmpty(_LastName) || String.IsNullOrWhiteSpace(_LastName))
        {
            return "Empty"; // or whatever
        }
        else
        {
            return _LastName;
        }
    }
    set
    {
        if (String.IsNullOrEmpty(_LastName) || String.IsNullOrWhiteSpace(_LastName))
        {
            _LastName = value;
        }
        // else do not set
    }