Преобразование универсального IDictionary в ASP.NET MVC IEnumerable <SelectListItem>: выбор выбранного элемента - PullRequest
3 голосов
/ 08 июня 2011

Вот полная реализация, которую я рассматриваю:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;

namespace Utils {
    public static class IDictionaryExt {
        public static IEnumerable<SelectListItem> ToSelectListItems<T, R>(this IDictionary<T, R> dic, T selectedKey) {
            return dic.Select(x => new SelectListItem() { Text = x.Value.ToString(), Value = x.Key.ToString(), Selected=(dynamic)x.Key == (dynamic)selectedKey });
        }
    }
}

Обратите внимание на проверку равенства с использованием динамических приведений: (dynamic)x.Key == (dynamic)selectedKey.Это лучший способ проверить равенство между selectedKey и x.Key здесь?Основываясь на комментарии @ Gabe в Оператор '==' не может быть применен к типу T? , я считаю, что это так: разрешение перегрузки откладывается до времени выполнения, но мы получаем "нормальное" разрешение перегрузки (т. е. учитывая ValueType с и другие Object с с перегрузками == против Object с с эталонным равенством по умолчанию).

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Лучший способ справиться с этой ситуацией - использовать EqualityComparer<T>.Default

return dic.Select(x => new SelectListItem() { Text = x.Value.ToString(), Value = x.Key.ToString(), Selected= EqualityComparer<T>.Default.Equals(x.Key, selectedKey) });
1 голос
/ 08 июня 2011

Если вы не хотите использовать x.Key.Equals, вы можете вывести сравнение в Func:

public static IEnumerable<SelectListItem> ToSelectListItems<T, R>(this IDictionary<T, R> dic, Func<T, bool> selectedKey)
{
    return dic.Select(x => new SelectListItem() { Text = x.Value.ToString(), Value = x.Key.ToString(), Selected = selectedKey(x.Key) });
}

, затем вызвать его так:

var list = sampleDictionary.ToSelectListItems(k => k == "Some Key");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...