将对象转换为KeyValuePair

本文关键字:KeyValuePair 转换 对象 | 更新日期: 2023-09-27 18:28:03

对于具有stringint成员的实体,我有一个IEnumerable<Entityclass>i需要将其转换为KeyValuePair<string, double>的数组,反之亦然

它因强制转换错误而失败。

[DataContract]
public class Entityclass
{
    [DataMember]
    public string text{ get; set; }
    [DataMember]
    public int textcount{ get; set; }
 }

我有IEnumerable<Entityclass>

  • 如何从IEnumerable<Entityclass>转换为KeyvaluePair<string, double>[]的数组?

  • 如何将KeyvaluePair<string, double>[]数组转换为KeyvaluePair<string, int>[]数组?

  • 如何将KeyvaluePair<string, double>转换回IEnumerable?

我试过:

  • topics is IEnumerable<Entityclass>;
  • topics.Cast<KeyValuePair<string, double>>().ToArray();因强制转换错误而失败

将对象转换为KeyValuePair

您需要每个主题投影到KeyValuePair中。Linq Select扩展方法做到了这一点:

topics
    .Select(x=> new KeyValuePair<string, double>(x.text, x.textcount))
    .ToArray();

IEnumerable有一个名为ToDictionary的扩展。这是我们自己的ToKeyValuePairs的一个很好的起点。

public static List<KeyValuePair<TKey, TElement>> ToKeyValuePairs<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
{
    List<KeyValuePair<TKey, TElement>> pairs = new List<KeyValuePair<TKey, TElement>>();
    foreach (var element in source)
        pairs.Add(new KeyValuePair<TKey, TElement>(keySelector(element), elementSelector(element)));
    return pairs;
}

现在,在指定键和值的同时,很容易获取任何IEnumerable并将其转换为KeyValuePair

// Array of objects (tuples)
(string First, string Middle, string Last)[] tuples = new (string First, string Middle, string Last)[3];
tuples[0] = new("Micheal", "Joseph", "Jackson");
tuples[1] = new("Elvis", "Aaron", "Presley");
tuples[2] = new("Arnold", "Alois ", "Schwarzenegger");
// Convert only First and Last properties to KeyValuePairs.
var keyPairs = tuples.ToKeyValuePairs(a => a.First, a => a.Last);

在您的情况下,您只需要使用.ToArray()中的内部版本。

var keyPairs = tuples.ToKeyValuePairs(a => a.First, a => a.Last).ToArray();