![](/img/trans.png)
[英]Dictionary<string, MyObject> or List<MyObject> with C# 3.5?
[英]C# Can a dictionary<int, myobject> be converted into a list?
讓我們假設這是我的自定義對象
public class myObject
{
public int Id {get;set;}
public string Name {get;set;}
public string Location {get;set;}
}
我正在字典中返回myObject
實例的集合:
return new Dictionary<int, List<MyObject>>();
這個集合基本上是我的對象的列表。 密鑰是指與myObject
類具有一對多關系的父類的Id
。
從詞典創建列表的最佳方法是什么?
我計划不使用Dictionary<int, List<MyObject>>
,而打算使用:
public class myObject
{
public int Id {get;set;}
public string Name {get;set;}
public string Location {get;set;}
public int ParentId {get;set;}**
}
然后返回:
return new List<MyObject> myObjects();
你有什么建議?
return myDict.Values.ToList();
您只需要獲取這些值,這很方便。
編輯:
現在,我對問題有了更多的了解,您想要在返回列表之前將每個對象的ID字段設置為Dictionary中的鍵(父ID)。
好吧,首先,我建議您先設置該屬性,然后再將其添加到列表中。 但是,如果您不能執行此操作(出於某些不可思議的原因),則可以事先簡單地遍歷Dictionary並設置屬性:
foreach( var pair in dict )
{
foreach( var myObj in pari.Value )
{
myObj.Id = pair.Key;
}
}
return dict.Values.ToList();
讓我知道我是否在這里遺漏了您的基本問題。
是否要將鍵或值放入列表?
對於密鑰,請執行以下操作:
return new List<int>(dict.Keys);
對於值(我認為這是您想要的),請執行以下操作:
return new List<MyObject>(dict.Values);
如果兩者都需要,則可以使用Tuple ,但是必須使用.NET 4.0或更高版本。
List<Tuple<int, MyObject>> list = new List<Tuple<int, MyObject>>();
foreach (var i in dict.Keys) {
list.Add(Tuple.Create(i, dict[i]));
}
return list;
這個集合基本上是我的對象的列表。 密鑰是指與myObject類具有一對多關系的父類的ID。
字典中的鍵應該是唯一的,那么在這種情況下如何創建一對多關系?
無論如何,您首先必須創建一個新類,該類能夠容納所有現有值以及額外的parentId:
public class MyObject2
{
public MyObject2(int id, string name, string location, int parentId)
{
this.Id = id;
this.Name = name;
this.Location = location;
this.ParentId = parentId;
}
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public string Location
{
get;
set;
}
public int ParentId
{
get;
set;
}
public override string ToString()
{
return String.Format ("Id={0}; Name={1}; Location={2}; ParentId={3}", Id, Name, Location, ParentId);
}
}
然后,通過一個簡單的LINQ查詢,您可以實現所需的功能:
var dict = new Dictionary<int, myObject> ();
dict.Add(2, new myObject(1, "Test1", "Somewhere"));
dict.Add (1, new myObject (2, "Test2", "location"));
var result = dict.Select (kp => new MyObject2 (kp.Value.Id, kp.Value.Name, kp.Value.Location, kp.Key)).ToList ();
foreach( var r in result )
{
Console.WriteLine (r.ToString ());
}
Console.ReadLine ();
如果您希望鍵是ParentId
,而值是擁有該父項的MyObject的所有實例,那么Dictionary可能不是最好的數據結構。 也許您想使用Lookup ,它基本上是一個Dictionary,可以為單個鍵具有多個值。 (可能的)缺點是查找是只讀的。 您只需創建一次,然后使用它來查找內容。 但是您以后不能修改它,只能重新創建它。
給定MyObject所有實例的列表,您將創建一個如下所示的Lookup:
ILookup<int, MyObject> myLookup = allObjects.ToLookup(x => x.ParentId);
編輯:
我從另一個答案的評論中看到,您實際上是從Dictionary<int, List<MyObject>>
(在道德上等同於Lookup)開始的,並且您想要獲取MyObject所有實例的扁平列表。 這實際上是一個簡單的方法:
IEnumerable<MyObject> allObjects = dict.Values.SelectMany(x => x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.