2010-11-24 117 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); 

     }