2010-11-24 5 views
0

Je ne peux pas exprimer ce que je veux faire. S'il vous plaît aider. Compte tenu de mon code ci-dessous:Comment faire cela dans 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; } 
} 

Je veux imprimer la Name | Age | Status d'une personne.

Status est une colonne dérivée. Où il devrait avoir une valeur de "Adult" si l'âge de la personne est> = 18, sinon "Moins d'âge".

Répondre

6

Vous devez d'abord ajouter une propriété nommée Status à la classe 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); 
    } 
} 

alors vous pouvez boucle dans la liste de la personne à faire votre action:

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

La raison de l'ajout Status propriété et dominante méthode ToString est de mettre la logique en un seul endroit. Sinon, supposons un jour, vous devez changer "Moins d'âge" en "Nonage", vous n'aurez pas besoin de changer les chaînes partout mais seulement une place dans votre classe Person.

+1

'Status' est une colonne dérivée qui n'est pas une propriété. – yonan2236

+4

@ yonan2236: Vous devriez en faire une propriété, c'est la bonne façon. Sinon, chaque fois que vous voulez afficher le 'Status', vous devez écrire cette logique (age> = 18). –

+0

@yonan: Si vous me dites que vous ne pouvez pas changer le code source de 'Person', c'est une autre chose. –

0

essayer:

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

Que diriez-vous:

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

Puis un autre:

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 = personne.Sélectionnez (x => new {x.Name, x.Age, Status = x.Age> 18? "Adult": "Minor"});

0

Son simple .. sb.ToString() vous donnera ce que vous voulez.

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

la question était sur Linq. Ce n'est pas la réponse qu'il cherche. – Jagannath