2011-12-23 23 views
9

Tôi có một Dictionary<string, User>.Cách nhận vật phẩm từ điển theo giá trị của bất động sản

User là một đối tượng có các thuộc tính UID, UNIQUE KEY và hơn thế nữa. Khóa từ điển của tôi là số UNIQUE KEY của người dùng.

Bây giờ, tôi muốn nhận được User từ giá trị từ điển của mình bằng UID và không phải là khóa, chẳng hạn như ContainsKey .. cách thực hiện với lambda expr hoặc LINQ? có một giải pháp tốt cho điều đó không?

+2

hãy đăng mã bạn có cho đến nay (nếu có). Nếu bạn chưa có, hãy viết nó và quay lại khi bạn có thể cung cấp một ví dụ. – Adam

Trả lời

15

Dưới đây là một ví dụ làm việc:

using System; 
using System.Collections.Generic; 
using System.Linq; 

internal class User 
    { 
     public string ID { get; set; } 

     public string Name { get; set; } 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Dictionary<string, User> dic = new Dictionary<string, User>(); 
      dic.Add("1", new User { ID = "id1", Name = "name1" }); 
      dic.Add("2", new User { ID = "id2", Name = "name2" }); 
      dic.Add("3", new User { ID = "id3", Name = "name3" }); 

      User user = dic.Where(z => z.Value.ID == "id2").FirstOrDefault().Value; 

      Console.ReadKey(); 
     } 
    } 
+0

Ký hiệu ngắn hơn : Người dùng người dùng = dic.FirstOrDefault (z => z.Value.ID == "id2"). Và nó cần một kiểm tra null trên FirstOrDefault cũng như để tránh NullReferenceException về giá trị;) –

+0

Hoặc kiểm tra câu trả lời này với Don John Corleone Skeet cho một cuộc thảo luận: http://stackoverflow.com/questions/5424968/dictionary-firstordefault-how -để xác định-nếu-một-kết quả-đã được tìm thấy –

5
return dict.Single(x => x.Value.UID == target); 

Tất nhiên, bạn có thể thấy rằng thiết kế của bạn là vấn đề nếu nó liên tục thực hiện tìm kiếm tuyến tính trên Dictionary.

1

Tất nhiên bạn sẽ mất lợi ích của việc có một cuốn từ điển, nhưng bạn có thể làm someting như:

var user = dict.Values.FirstOrDefault(k=>k.UID==xxxx); 
+0

'FirstOrDefault' chấp nhận một biến vị ngữ tùy chọn, nếu được cung cấp, sẽ xử lý việc lọc (tức là' dict.Values.FirstOrDefault (k => k.UID == xxxx) '.) – mquander

+0

@mquander cảm ơn, cập nhật –

0

Điều này sẽ giúp người sử dụng cho UID từ điển:

public User GetUserForUid(Dictionary<string, User> dictionary, int uid) 
{ 
    return dictionary.Values.FirstOrDefault(u => u.UID == uid); 
} 
Các vấn đề liên quan