2010-11-24 11 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

まず、クラスPersonStatusという名前のプロパティを追加する必要があります。

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メソッドをオーバーライドする理由は、一箇所にロジックを置くことです。そうでなければ、ある日、 "年齢未満"を "Nonage"に変更する必要がある場合は、文字列をどこでも変更する必要はなく、Personクラスの1つの場所のみを変更する必要があります。

+1

'Status'は派生した列であり、プロパティではありません。 – yonan2236

+4

@ yonan2236:あなたはそれを正しいものにする必要があります。それ以外の場合は、 'Status'を表示するたびに、このロジック(age> = 18)を記述する必要があります。 –

+0

@yonan: 'Person'のソースコードを変更できないと言ったら、それはもう一つのことです。 –

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? "アダルト": "マイナー"});

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

     } 
+0

Linqについての質問でした。これは彼が探している答えではありません。 – Jagannath

関連する問題