2010-11-24 14 views
0

Ich kann nicht ausdrücken, was ich tun möchte. Bitte helfen Sie. Bedenkt meinen Code unten:Wie geht das in 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; } 
} 

Ich möchte die Name | Age | Status einer Person drucken.

Status ist eine abgeleitete Spalte. Wo sollte es einen Wert von "Adult" haben, wenn das Alter der Person> = 18 ist, sonst "Under age".

Antwort

6

Zuerst müssen Sie eine Eigenschaft hinzufügen namens Status Klasse 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); 
    } 
} 

dann können Sie Schleife in die Liste der Person Ihre Aktion zu tun:

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

Der Grund für das Hinzufügen Status Eigenschaft und übergeordnete ToString Methode ist die Logik in einem Ort zu setzen. Angenommen, Sie müssen eines Tages "Under age" in "Nonage" ändern, müssen Sie die Zeichenfolgen nicht überall ändern, sondern nur an einer Stelle in Ihrer Klasse Person.

+1

'Status' ist eine abgeleitete Spalte, keine Eigenschaft. – yonan2236

+4

@ yonan2236: Sie sollten es eine Eigenschaft machen, das ist der richtige Weg. Andernfalls müssen Sie jedes Mal, wenn Sie den Status anzeigen möchten, diese Logik schreiben (Alter> = 18). –

+0

@yonan: Wenn Sie mir sagen, dass Sie den Quellcode von 'Person' nicht ändern können, ist das eine andere Sache. –

0

Versuch:

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

Wie wäre:

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

Dann woanders:

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 => neu {x.Name, x.Age, Status = x.Age> 18? "Adult": "Klein"});

0

Seine einfache .. sb.ToString() wird Ihnen geben, was Sie wollen.

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); 

     } 
+0

ging es um Linq. Dies ist nicht die Antwort, nach der er sucht. – Jagannath