.NET(C#):在KeyedCollection類型中加字典的TryGetValue方法

來源:互聯網
上載者:User

TryGetValue方法很常用,可以把“判斷鍵存在”和“根據鍵取值”兩步轉化為一步,這樣鍵的雜湊值只計算一次,是很有效率的。但注意IDictionary介面並沒有定義TryGetValue,而泛型介面IDictionary<T, V>定義了TryGetValue。而KeyedCollection類型卻繼承自類型Collection<T>,Collection<T>繼承介面ICollection<T>。原因應該是KeyedCollection不僅僅是字典,還包含一個線性表吧。因此KeyedCollection預設是沒有TryGetValue的。

 

但是KeyedCollection有一個受保護的成員:Dictionary屬性。正好返回一個泛型的IDictionary代表內部字典,因此改寫KeyedCollection時調用這個內部IDictionary的TryGetValue就可以了。

 

比如先定義一個簡單的類型:Student,Id屬性是成員的鍵。

class Student

{

    public int Id { get; set; }

    public string Name { get; set; }

}

 

KeyedCollection這樣定義:

//+ using System.Collections.ObjectModel;

class MyKeyedCollection : KeyedCollection<int, Student>

{

    //輔助添加方法

    public void Add(int id, string name)

    {

        Add(new Student() { Id = id, Name = name });

    }

 

    //改寫抽象方法:GetKeyForItem

    protected override int GetKeyForItem(Student item)

    {

        return item.Id;

    }

 

    //將受保護IDictionary的TryGetValue顯式定義

    public bool TryGetValue(int key, out Student value)

    {

        return Dictionary.TryGetValue(key, out value);

    }

}

 

範例程式碼:

var dic = new MyKeyedCollection();

 

dic.Add(3, "martin");

dic.Add(1, "tony");

dic.Add(2, "liu");

 

Student st;

if (dic.TryGetValue(1, out st))

    Console.WriteLine(st.Name);

else

    Console.WriteLine("沒找到");

 

輸出:

tony

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.