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