2010-11-24 191 views
0

我无法表达我想要做的事情。请帮忙。考虑下面我的代码:如何在LINQ中执行此操作?

void Main() 
{ 
    List<Person> person = new List<Person> 
    { 
     new Person { Name = "Maria Anders", Age = 21 }, 
     new Person { Name = "Ana Trujillo", Age = 55 }, 
     new Person { Name = "Thomas Hardy", Age = 40 }, 
     new Person { Name = "Laurence Lebihan", Age = 18 }, 
     new Person { Name = "Victoria Ashworth", Age = 16 }, 
     new Person { Name = "Ann Devon", Age = 12 } 
    }; 

    person.Select(x => new { x.Name, x.Age }).Dump(); 
} 

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

我想打印一个人的Name | Age | Status

Status是派生列。如果人的年龄> 18岁,则其值应该是“Adult”,否则“年龄不足”。

回答

6

首先,你需要一个名为Status属性添加到Person类。

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Status 
    { 
     get { return Age >= 18 ? "Adult" : "Under age"; } 
    } 
    public override string ToString() 
    { 
     return string.Format("{0}|{1}|{2}",Name,Age,Status); 
    } 
} 

那么你可以循环到人名单做你的行动:

foreach(Person p in persons) 
{ 
    Console.WriteLine(p); 
} 
//Or 
persons.ForEach(p => Console.WriteLine(p)); 

加入Status财产和压倒一切的ToString方法的原因是把逻辑在一个地方。否则,假设有一天,你需要将“Under age”改为“Nonage”,你不需要改变任何地方的字符串,而只需要在你的Person类中的一个地方。

+1

“状态”是派生列而非属性。 – yonan2236 2010-11-24 06:29:02

+4

@ yonan2236:你应该让它成为一个属性,这是正确的方法。否则,每次你想显示“状态”时,都需要写入这个逻辑(年龄> = 18)。 – 2010-11-24 06:32:33

0

尝试:

person.Select(x => new {Name = x.Name, Age = x.Age, Status = ((x.Age>=18) ? "Adult" :"Child") }); ; 
2

如何:

person.Select(p => 
    String.Format("{0} | {1} | {2}", 
    p.Name, p.Age, p.Age >= 18 ? "Adult" : "Under age")) 
    .Dump(); 

然后在别处:

static void Dump(this IEnumerable<string> ss) 
{ 
    foreach(var s in ss) 
    { 
     Console.WriteLine(s); 
    } 
} 
1
person.Select(x => new { x.Name, x.Age ,Status = (x.Age>=18) ? "Adult":"Under Age"}) 
1

var y = person.Select(x => new {x.Name,x.Age,Status = x.Age> 18?“Adult”:“Minor”});

0

其简单.. sb.ToString()会给你你想要的。

StringBuilder sb = new StringBuilder(); 

     foreach(Person p in person) 
     { 
     string status = p.Age >= 18 ? "Adult" : "Not Adult"; 

     sb.AppendLine(String.Format("{0} {1} {2}",p.Name,p.Age.ToString(),status)); 
     sb.AppendLine(Environment.NewLine); 

     }