4

メンテナンスを実行しようとしているドロップダウンリスト内で使用するために、特定のクラスインスタンスの特定の要素を取得する方法を見つけようとしています。目標は、すべての連絡先を選択してキー/値ペアの文字列配列に割り当て(連絡先は会社の関連エンティティ、具体的には1:nの関係-1つの会社には複数の連絡先があります)、最初の連絡先の姓名属性を選択することですブールクラス属性PrimaryがTrueに設定されているシーケンスから外れています。

public class Company 
{
    public string Name { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

public class Contact
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public bool IsPrimary { get; set; }
}

次のコード:

private Company CreateViewModel(Company company)
{
    var contacts = _contactService.CompanyContacts(company);

}

public Dictionary<string, string> CompanyContacts(Company company)
            {
                    var results = new Dictionary<string, string>();

                    foreach (var contact in company.Contacts)
                    {
                            var key = string.Format("{0} {1}|{2}", contact.FirstName, contact.LastName, contact.IsPrimary());

                            var val = string.Format("{0} {1}|{2}", contact.FirstName, contact.LastName, contact.IsPrimary());

                            if (results.ContainsKey(key)) continue;

                            results.Add(key, val);
                    }

                    return results;
            }

    public void InitContactList(Dictionary<string, string> contacts)
    {

        var firstOrDefault = contacts
            .Where(x => x.Key.Contains("true"))
            .Select(x => x.Value)
            .FirstOrDefault();

        var selectedContact = contacts.FirstOrDefault().Value;

            if (firstOrDefault != null)
            {
                var selectedContact =  firstOrDefault;

                ContactList = new SelectList(contacts, "Key", "Value")
                .SelectByText(selectedContact.ToString()).ToList();
            }

            ContactList = new SelectList(contacts, "Key", "Value")
                .SelectByText(selectedContact.ToString()).ToList();
    }

ただし、デフォルトでは、選択リストに最初の「プライマリ」連絡先は表示されません。最初のisPrimary=1連絡先を選択リストの最初の選択にします。InitContactListのfirstOrDefault変数は、キーに.contains( "true")以外の何かを実行させる必要があると確信しています。助けていただければ幸いです。前もって感謝します。

4

1 に答える 1

1

あなたがコードに持っているもので私に突き出ているのは

x.Key.Contains("true")

部。これは、大文字と小文字を区別して文字列を比較します。辞書アイテムの値は、ブール値を「False」または「True」のいずれかの値を持つ文字列に変換します。最も簡単な解決策は、linqwhereステートメントを次のように変更することです。

x.Key.Contains("True")

ただし、これは文字列の任意の部分で「True」を検索し、大文字と小文字が区別されるため、これは最善の解決策ではない可能性があります。「より良い」解決策は、大文字と小文字を区別しない比較方法を使用することです。私がプロジェクトで数回使用した拡張方法は次のとおりです。

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return false;
     return source.IndexOf(toCheck, comp) >= 0;
}

そして、whereステートメントを次のように変更できます。

x.Key.Contains("True", StringComparison.InvariantCultureIgnoreCase)

.NET 3.0以降を使用していない場合は、静的ユーティリティメソッドに簡単に変更できます。

于 2012-11-06T18:22:57.797 に答える