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

时间:2014-07-22 15:11:56

标签: c#

我已经定义了一个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

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

2 个答案:

答案 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
    }