1

次のリストを部門の値でグループ化する必要がありますが、LINQ 構文に問題があります。これが私のオブジェクトのリストです:

 var people = new List<Person>
 { 
    new Person { name = "John", department = new List<fields> {new fields { name = "department", value = "IT"}}}, 
    new Person { name = "Sally", department = new List<fields> {new fields { name = "department", value = "IT"}}},
    new Person { name = "Bob", department = new List<fields> {new fields { name = "department", value = "Finance"}}},
    new Person { name = "Wanda", department = new List<fields> {new fields { name = "department", value = "Finance"}}},
 };

私はグループ化をいじりました。これは私が持っている限りです:

var query = from p in people
            from field in p.department
            where field.name == "department"
            group p by field.value into departments
            select new
            {
                Department = departments.Key,
                Name = departments
            };

したがって、グループを反復処理できますが、人の名前をリストする方法がわかりません-

foreach (var department in query)
{
    Console.WriteLine("Department: {0}", department.Department);
    foreach (var foo in department.Department)
    {
        // ??
    }
}

何を改善すべきか、または関連部門の名前をリストする方法についてのアイデアはありますか?

4

3 に答える 3

0

ああ、こうあるべきだった:

foreach (Person p in department.Name) Console.WriteLine(p.name);

フョードルさん、追加の目をありがとう!

于 2012-11-20T03:52:19.363 に答える
0

あなたのdepartmentプロパティは、特に部門ごとにグループ化したい場合は、厄介な実装のように見えます。List をキーとしてグループ化すると、非常に複雑になります。また、List 内の 1 つの要素しか気にしないため、これは不要です。

また、fields動的/匿名型、またはクラスだけをシミュレートする方法としてクラスを作成したようですDictionary<string, string>が、実際にはわかりません。そうしないことをお勧めします。C# には既にこれらの型が組み込まれており、それらを回避することは非効率的であり、Intellisense を使用できなくなります。あなたがそうするようになった理由が何であれ、おそらくより良い、より C# っぽい方法があるでしょう。departmentその上、これが重要ですが、あなたのコードは、すべてを忘れて単純な文字列を作成できるように見えます。

データ構造を制御できる場合は、再編成することをお勧めします。

var people = new List<Person> { 
    new Person { name = "John", department = "IT"}, 
    new Person { name = "Sally", department = "IT"},
    new Person { name = "Bob", department = "Finance"},
    new Person { name = "Wanda", department = "Finance"},
};

突然、すべてをグループ化すると簡単になります。

var departments = from p in people
                  group p by p.department into dept
                  select dept;

foreach (var dept in departments)
{
    Console.WriteLine("Department: {0}", dept.Key);
    foreach (var person in dept)
    {
        Console.WriteLine("Person: {0}", person.name);
    }
}

データ構造をそのままにしておく必要がある場合は、これを試すことができます。

from p in people
from field in p.department
where field.name equals "department"
group p by field.value into dept
select dept;

これは、上記のネストされたループで機能するはずです。

于 2012-11-20T03:42:08.950 に答える
0

各部門の担当者のリストには、 からアクセスできますdepartment.Name。それを繰り返すだけです:

    foreach( var person in department.Name ) Console.WriteLine( person.name );

department.Department一方、の値は型stringです。この値は から取得されdepartments.Key、これはさらに から取得field.valueされます。これは、グループ化するキーであるためです。

を実装しているため、 foreach ステートメントはdepartment.Department引き続き正常にコンパイルされます。したがって、変数のタイプは.stringIEnumerable<char>foochar

于 2012-11-20T03:35:30.417 に答える