簡體   English   中英

C#可以詞典嗎 <int, myobject> 被轉換成列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM