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

标签 c#

我定义了一个,其中包含一些我可以获取或设置的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;
});

关于c# - 填充对象的属性而不覆盖它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891140/

相关文章:

c# - 如何使用 LINQ 查询列表 <T>

c# - 预减量和。递减后

c# - 在 Entity Framework 查询的 Select 子句中使用函数

c# - Visual Studio 2017 C# 格式化 : One-Line If Statements

c# - 一种更简洁的方法来自动调用一个又一个方法?

c# - NullReferenceException 错误 C#

c# - 如何通过反射区分值类型、可空值类型、枚举、可空枚举、引用类型?

c# - 无法使 CefSharp 加载同步

c# - 将 Laravel AES 256 加密转换为 C#

c# - OrderBy 自定义比较器数字前的特定字母