2012-04-24 26 views
16

Tôi cóLàm thế nào để có được giá trị MAX từ điển?

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 

Làm thế nào tôi có thể nhận được một Guid trong đó có MAX giá trị?

+3

thể trùng lặp của [Get Max() của giá trị chữ và số] (http://stackoverflow.com/questions/7268605/get-max-of-alphanumeric-value) –

+0

Hãy cố gắng để làm nghiên cứu của riêng bạn trước đặt câu hỏi về SO. –

+1

Vì "GUID" là viết tắt của "số nhận dạng duy nhất toàn cầu", có vẻ như kỳ lạ là bạn sẽ muốn có giá trị "tối đa". GUID được sử dụng vì tính duy nhất của nó; Tôi không thể nghĩ ra một ứng dụng thế giới thực mà ở đó có ý nghĩa khi nghĩ về chúng theo trật tự. – jpmc26

Trả lời

29

Sử dụng LINQ:

d.Keys.Max(); // Returns the greatest key 
+7

Nhưng anh ta yêu cầu Khóa có Giá trị tối đa. Điều này chỉ cung cấp cho chúng tôi Khóa tối đa, vì vậy đó là điều sai trái. – robbpriestley

+0

Câu hỏi có thể được diễn giải theo cả hai cách, và vì OP chấp nhận câu trả lời này, tôi có thể giả định rằng đây là ý của anh ấy. – Asik

5

Guid thực hiện IComparable, vì vậy:

d.Keys.Max() 

Ngoài ra nó không phải là rõ ràng lý do tại sao người ta sẽ muốn làm như vậy ...

9
  var maxGuid = Guid.Empty; 
      var maxDateTime = DateTime.MinValue; 
      foreach (var kvp in d) 
      { 
       if (kvp.Value > maxDateTime) 
       { 
        maxGuid = kvp.Key; 
        maxDateTime = kvp.Value; 
       } 
      } 
      Console.WriteLine("Guid of max date is: " + maxGuid.ToString()); 
+1

Giả sử bạn muốn GUID cho Thời gian tối đa ... –

+1

Đọc lại câu hỏi, tôi nghĩ đây là giải thích chính xác và câu trả lời duy nhất cho kết quả chính xác (mặc dù tôi nghi ngờ nó có thể được làm ngắn hơn với LINQ, nó sẽ không nhanh hơn vòng lặp rõ ràng này). –

+0

@BenVoigt vòng lặp rõ ràng là giải quyết tốt nhất ở đây về độ rõ ràng. Một bài đăng khác ở đây (https://stackoverflow.com/q/2805703/465053) với một số câu trả lời rất hay. Câu trả lời được chấp nhận trong bài đăng này yêu cầu phải quét đơn bằng LINQ. – RBT

29

này hoạt động tốt. Nó sẽ trả về GUID cho ngày MAX.

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 
var guidForMaxDate = d.FirstOrDefault(x => x.Value == d.Values.Max()).Key; 
+1

Mã rắn thực hiện công việc –

+0

Tốt, mặc dù tôi muốn nhận được 'd.Values.Max()' vào một biến trước, nếu không nó có thể sẽ lặp lại tìm kiếm đó cho Max() trong mỗi lần lặp đơn. – Nyerguds

0

Một cách khác có thể giúp nhận được Single KeyValuePair.

KeyValuePair<char, int> GuidKeyPair = guidDict.FirstOrDefault(MaxGuid => MaxGuid.Value == guidDict.Values.Max()); 
5

Đặt hàng dữ liệu của bạn ngay từ đầu có thể là một giải pháp.

var maxGuid = d.OrderByDescending(x => x.Value).FirstOrDefault().Key; 
0

Câu trả lời được chấp nhận không phù hợp với tôi. Mã sau đây (sử dụng MoreLinq) đã thực hiện công việc:

var fooDict = new Dictionary<string, int>(); 
var keyForBiggest = fooDict.MaxBy(kvp => kvp.Value).Key; 
var biggestInt = fooDict[keyForBiggest]; 
0

Bằng cách sử dụng LINQ trên từ điển.

var MaximumValue = dict.FirstOrDefault(x => x.Value.Equals(dict.Values.Max())); 
Các vấn đề liên quan