将泛型 IEnumerable<T> 转换为 IEnumerable<KeyValuePair> (C#)
Convert a generic IEnumerable<T> to IEnumerable<KeyValuePair> (C#)
在下面的代码中,我需要明确提及 CountryId
和 CountryName
但我想避免这种情况并尝试创建一个 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),第二个 属性 是字符串。
我正在考虑使用 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;
}
如果你有更好的想法来达到同样的效果,那么请提出。
您可以通过传递用作键和值的属性来使其通用。我认为使用名为 KeyValuePair<Tkey, TValue>
的通用 struct
比自己重新发明轮子更好:
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));
在下面的代码中,我需要明确提及 CountryId
和 CountryName
但我想避免这种情况并尝试创建一个 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),第二个 属性 是字符串。
我正在考虑使用 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;
}
如果你有更好的想法来达到同样的效果,那么请提出。
您可以通过传递用作键和值的属性来使其通用。我认为使用名为 KeyValuePair<Tkey, TValue>
的通用 struct
比自己重新发明轮子更好:
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));