Linq组合字段

3

我想确认是否有更优雅的方法使用Linq完成这个任务。为了简洁起见,我大大简化了代码。稍后我会解释原因,但它的流程如下:

(from t in doc.Descendants(p + "Task")
where t.Element(p + "Name") != null
select new {
     FirstName = t.FirstName,
     LastName = t.LastName,
     FullName = FirstName + " " + LastName  // Error!
}

是的,我知道FullName = t.FirstName + " " + t.LastName这样做很简单,但是让我们想象一下,如果FirstName和LastName是复杂的内联计算而不是简单的变量呢?那么FullName = [big ugly calc 1] + [big ugly calc 2]。所以在DRY的精神下,有更好的方法吗?我的第一个想法是编写一个函数来获取FirstName和LastName。但是有更好的方法吗?

3个回答

8

好的,您可以这样做:

from t in doc.Descendants(p + "Task")
where t.Element(p + "Name") != null
let FirstName = t.FirstName
let LastName = t.LastName
select new { FirstName, LastName, Fullname = FirstName + LastName }

虽然它经过的投影可能会有些低效,但它仍能工作。

稍微更有效的方法是:

from t in doc.Descendants(p + "Task")
where t.Element(p + "Name") != null
select new { t.FirstName, t.LastName } into x
select new { x.FirstName, x.LastName, FullName = x.FirstName + x.LastName }

1
啊,你比我先回答了。你们是不是比我们其他人早几分钟收到这些问题的? :) - Winston Smith
@Winston - 是啊,这似乎总是发生在我身上! - user110714

2
如果您不使用匿名类型,可以完全不指定FullName并将其定义为计算字段。
示例:
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
}

然后在您的linq语句中使用它:

(from t in doc.Descendants(p + "Task")
where t.Element(p + "Name") != null
select new Person {
     FirstName = t.FirstName,
     LastName = t.LastName
}

2

您可以做的事情

public void SomeClassMethod()
{
    List<Person> people = new List<Person>();

    people.Add(new Person() { FirstName = "Bob", Surname = "Smith" });
    people.Add(new Person() { FirstName = "Sally", Surname = "Jones" });

    var results =
        from p in people
        let name = p.FirstName + " " + p.Surname
        select new
        {
            FirstName = p.FirstName,
            Surname = p.Surname,
            FullName = name
        };  
}

public class Person
{
    public String FirstName { get; set; }
    public String Surname { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接