1

私はRoles以下を引き出そうとしていますIEnumerable<KeyValuePair<int, string>>

<PROJECT PROJECT_NO="161917"> 
  <CONTACT CLIENT_ID="030423253272735482765C" CONTACT_NO="1"> 
    <ROLE ROLE_ID="2" ROLE_DESC="ARCHITECT" /> 
    <ROLE ROLE_ID="5" ROLE_DESC="INTEGRATOR" /> 
  </CONTACT>
</PROJECT>



private static ProjectContact BuildProjectContactFromXml(XElement xml)
    {
        ProjectContact projectContact = new ProjectContact();
        projectContact.ProjectId = SafeConvert.ToInt32(xml.Attribute("PROJECT_NO").Value);
        projectContact.Roles = xml.Elements()
                                    .First()
                                    .Elements()
                                    .Select(role => new KeyValuePair<int, string>(
                                                            SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value), 
                                                            role.Attribute("ROLE_DESC").Value));

        return projectContact;
    }

私の質問は、この Linq ステートメントの遅延実行に関するものです。この ProjectContact を返すとき、Linq ステートメントはまだ実行されていないと理解しています。誰かがロールにアクセスしようとしたときではなく、このメソッドで実行されるように、このステートメントの実行を強制する方法はありますか? .Count() を呼び出すことでステートメントの実行を強制できると思いますが、もっと良い方法があるはずです。

4

2 に答える 2

2

projectContact.RolesそれはIEnumerable<KeyValuePair<int, string>>あなたが望むものになるでしょうか、それともリストまたは辞書として欲しいですか? .ToList()リストの場合は、ステートメントの最後にタックします。

辞書の場合は、少しトリッキーです。

   projectContact.Roles = xml.Elements() 
                                .First() 
                                .Elements()
                                .ToDictionary(
                 role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value),
                 role=> role.Attribute("ROLE_DESC").Value)); 

更新: コメントでは、 Roles id と述べていますIEnumerable<KeyValuePair<int, string>>。技術的には、それはディクショナリまたはリストのいずれかである可能性がありますが、前者の場合、そのインターフェイスを介してディクショナリ性を実際に使用することはできません。さらに言えば、後者の場合はリストネスの多くを使用できますが、特にその機能は必要ないようです。

だから、タックオン.ToList();。これは舞台裏では List になりますが、余計な手間をかけずに、ユーザーは IEnumerable としてしか使用できません。

于 2010-08-06T15:58:38.047 に答える
2

のデータ型.Rolesが配列の場合、 の.ToArray()後に追加するだけ.Select()で、クエリが確実に実行されます。

いずれにせよ、ToList()またはを実行する.ToArray()と、クエリが実行されます。

于 2010-08-06T15:59:04.343 に答える