1

有没有办法转换Dictionary<string, obj>为对象集合,使得集合中的每个对象都包含键作为另一个属性

这是 obj 的类 def

class someclass
{
  string property1;
  string property2;
}

转换后,我希望集合中的每个对象都像

obj.property1
obj.property2
obj.Key

从那以后我一直在努力解决这个问题,我寻求一些帮助。有任何想法吗?

提前致谢。

4

4 回答 4

2

就像是

var myCollection = from de in myDictionary 
                   select new
                   {
                       de.Value.property1,
                       de.Value.property2,
                       de.Key
                   }.ToList();  // or .ToArray()

应该做的伎俩。

这将返回具有您请求的属性的新匿名类型的列表。

于 2012-07-19T18:53:01.847 回答
2

您还可以(除了匿名类型 apporach)使用List<Tuple<string, string, string>>

var list= dictionary
         .Select(kv => Tuple.Create(kv.Value.property1, kv.Value.property2, kv.Key))
         .ToList();

foreach(var item in list)
{
   Console.WriteLine("property1:{0 property2:{1} key:{2}"
                     , item.Item1
                     , item.Item2
                     , item.Item3);
}

与匿名类型相比的优点是您可以Tuple轻松地从方法中返回。

编辑:第三个选项(我最喜欢的)是简单地创建您在某处声明的类的实例。这是理想的方式。我不知道为什么我认为您想要“即时”上课。

class someOtherClass
{
    public string property1{ get; set; };
    public string property2{ get; set; };
    public string Key{ get; set; };
}

List<someOtherClass> objects = dictionary
.Select(kv => new someOtherClass(){
     property1 = kv.Value.property1, 
     property2 = kv.Value.property2, 
     Key       = kv.Key 
 })
.ToList();
于 2012-07-19T18:57:26.100 回答
1

如果您不想像这样存储结果,则可以使用匿名类型:例如,如果您只是想将其用作数据源。

var res = myDictionary.Select(pair => new { pair.Key, pair.Value.Property1, pair.Value.Property2 });
于 2012-07-19T23:20:02.010 回答
0

其他答案都很好,所以这只是一个补充。

您可以使用Length三个数组:

var arrays = myDictionary
    .Select(kv => new[] { kv.Value.property1, kv.Value.property2, kv.Key, });

或者你可以写一个新的类

class SomeclassAndKey
{
  public string property1;
  public string property1;
  public string Key;
}

然后说

var someclassAndKeys = myDictionary
    .Select(kv => new SomeclassAndKey { property1 = kv.Value.property1, property2 = kv.Value.property2, Key = kv.Key, });

.ToList()在每种情况下,如果您不想推迟枚举并得到一个完整的结果,您可以追加List<>

于 2012-07-19T19:20:21.707 回答