我已经定义了一个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
现在我要做的是能够为填充了数据的人设置 ONE 行,如果数据已经填充了之前的结果,那么不要覆盖它所以上面的例子中的结果将是:
Hoffman, Mark, BMW, 7209886985, 56
我能做到的算法和方法是什么?
答案 0 :(得分:2)
鉴于您有一个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;
});
答案 1 :(得分:1)
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
}