2

Personオブジェクトがあります:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public double Height { get; set; }
    public bool IsTest { get; set; }
}

Person次に、さまざまなオブジェクトで満たされたリストがあります。

オブジェクトのプロパティに応じて、LINQでGroupByで三項演算子を使用する方法があるかどうかを知りたいです。例えば:

var groupedPersons = persons.GroupBy(person => person.IsTest ? 
                      new {
                              person.Name, 
                              person.Age, 
                              person.Address
                           } 
                     : new {
                              person.Name, 
                              person.Age, 
                              person.Address, 
                              person.Height}).ToList();

しかし、残念ながらそれは機能しません、私に例外を与えます

'AnonymousType#1'と'AnonymousType#2'の間に暗黙の変換がないため、条件式のタイプを判別できません。

これはまったく達成可能ですか、そしてどのようにですか?

ありがとう

編集:これを試しましたが、機能していません。

var groupedPersons = persons.GroupBy(person => person.OnTest ? 
                     new Person { 
                                   Address = person.Address, 
                                   Name = person.Name, 
                                   Age = person.Age } 
                     : new Person { 
                                   Address= person.Address, 
                                   Name = person.Name, 
                                   Age = person.Age , 
                                   Height = person.Height}).ToList();

編集:それが機能するようになりました、私の答えを見てください

4

3 に答える 3

2

匿名オブジェクトを使用することが可能です。それらが同じフィールド名とフィールドタイプを持っていることを確認する必要があります。

var groupedPersons = persons.GroupBy(person => person.IsTest ? 
                      new {
                              person.Name, 
                              person.Age, 
                              person.Address,
                              Height = 0
                           } 
                     : new {
                              person.Name, 
                              person.Age, 
                              person.Address, 
                              person.Height}).ToList();

編集:これで、を割り当てるときに三項演算子を使用して、コードの数行を節約できるようになりましたHeight。高さ0の人がテスト対象者とグループ化されるのが心配な場合は、グループ化することもできIsTestます。

var groupedPersons = persons.GroupBy(person => 
                      new {
                              person.Name, 
                              person.Age, 
                              person.Address,
                              Height = person.IsTest ? 0 : person.Height,
                              person.IsTest
                           }).ToList();
于 2012-09-20T19:55:58.090 に答える
0

コンパイラは呼び出しの戻り型を認識できないためGroupBy(実際には2つの異なる型であるため)、グループの一部としてternaryを単独で使用することはできません。

Person代わりに、オブジェクトのプロパティ内にロジックを埋め込むことができます。

public class Person {
  public string Name { get; set; }
  public int Age { get; set; }
  public string Address { get; set; }
  public double Height { get; set; }
  public bool IsTest { get; set; }
  public double GroupProperty { get { return IsTest ? 0.0 : Height } }
}

var groupedPersons = persons.GroupBy(person =>
  new {
        person.Name,
        person.Age,
        person.Address,
        person.GroupByProperty
  }).ToList();

これにより、に設定されたすべてのインスタンスHeightのグループ化値としてのプロパティが削除されます(すべて同じ高さを共有するため)。PersonIsTesttrue

于 2012-09-20T19:30:40.450 に答える
-1

さて、ここに示されているいくつかの例を試した後、これは機能しないことに気付き、他の方法で機能させることができました。これが私がそれをした方法の例です:

var groupedPersons = 
       persons.GroupBy(
                 person =>
                      person.Name + "|" +
                      person.Age.ToString() + "|" +
                      person.Address + "|" +
                      (person.IsTest ? null : person.Height.ToString())
      .ToList();

したがって、プロパティを持つ人物がいる場合は、グループ化にもIsTest = false使用されます。person.Height

于 2012-09-21T06:56:30.673 に答える