在以下代码中,我需要明确提及CountryIdCountryName,但是我想避免这种情况并尝试创建generic method

public struct KeyValueStruct
{
    public int Key { get; set; }
    public string Value { get; set; }
}

private static IEnumerable<KeyValueStruct> ConvertPocoToKeyValueList(IEnumerable<CountryPoco> list)
{
    var result = new List<KeyValueStruct>();

    if (list != null)
    {
        foreach (var item in list)
        {
            result.Add(new KeyValueStruct()
            {
                Key = item.CountryId,
                Value = item.CountryName
            });
        }
    }

    return result;
}


我从列表中知道,第一个属性始终是整数(在此示例中为CountryId),第二个属性为String。

我当时正在考虑使用Generics来实现,但是不确定这是最好的方法,请参阅我提出的代码(尽管它不能正常工作)。

private static IEnumerable<KeyValueStruct> ConvertPocoToKeyValueList<T>(T list)
{
    var result = new List<KeyValueStruct>();

    if (list != null)
    {
        foreach (var item in list)
        {
            result.Add(new KeyValueStruct()
            {
                Key = item.CountryId,
                Value = item.CountryName
            });
        }
    }

    return result;
}


如果您有更好的想法来达到相同的结果,请提出建议。

最佳答案

您可以通过传递用作键和值的属性来使其通用。我认为使用名为struct的通用KeyValuePair<Tkey, TValue>胜过自己重新发明轮子:

private static IEnumerable<KeyValuePair<Tkey, TValue>>
                       ConvertPocoToKeyValueList<TSource, Tkey, TValue>
                                    (IEnumerable<TSource> list,
                                     Func<TSource, Tkey> keySelector,
                                     Func<TSource, TValue> valueSelector)
        {
            return list.Select(item => new KeyValuePair<Tkey, TValue>
                                          (keySelector(item), valueSelector(item)));
        }


用法:

var result = ConvertPocoToKeyValueList(list, x=> x.CountryId, x=> x.CountryName);


您甚至可以直接使用以下方法而无需使用此通用方法:

var result = list.Select(item => new KeyValuePair<Tkey, TValue>
                                              (item.CountryId, item.CountryName));

关于c# - 将通用IEnumerable <T>转换为IEnumerable <KeyValuePair>(C#),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38933627/

10-13 09:15