填充对象的属性而不覆盖它们
本文关键字:覆盖 对象 属性 填充 | 更新日期: 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
}