2011-04-25 6 views
5

मुझे मीडिया तिथि ऑब्जेक्ट्स की सूची <> को प्रकाशित दिनांक से क्रमबद्ध करने की आवश्यकता है ... प्रकाशित करने की तारीख आइटम की संपत्ति नहीं है। तो मेरा प्रारंभिक इरादा अस्थायी रूप से प्रकाशित तिथि संपत्ति पर कब्जा करना था, संपत्ति को लोड करना, क्रमबद्ध करना और संपत्ति को कुचलना था। मेरे काम पर किसी ने सुझाव दिया कि मैं टुपल का उपयोग करता हूं और LINQ के साथ सॉर्ट करता हूं ... मुझे इस स्निपेट परीक्षण में अब तक यह मिला है, सूची <> भरना ... लेकिन मुझे यकीन नहीं है कि उस दिनांक संपत्ति का उपयोग करके कैसे क्रमबद्ध करें LINQ। मैं अपने अंत को देखता रहूंगा लेकिन अगर किसी को कोई मदद मिलती है तो मैं इसकी सराहना करता हूं। धन्यवाद।सी # एक सूची छंटाई <> टुपल का उपयोग कर?

List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

      for (int i = 0; i <= 10; i++) 
      { 
       DateTime date = new DateTime(2011, i, 1); 
       MediaItem item = new MediaItem(); 
       list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
      } 

उत्तर

13

आप सॉर्टिंग करने के लिए OrderBy() LINQ ऑपरेटर का उपयोग कर सकते हैं; यह आपको एक ऐसा फ़ंक्शन पारित करने की अनुमति देता है जो तत्व को सॉर्ट करने के लिए निष्कर्ष निकालता है। चूंकि टुपल का दूसरा सदस्य दिनांक है, इसलिए हम Item2 द्वारा ऑर्डर करते हैं।

var result = list.OrderBy(x => x.Item2).ToList(); 

आप के बजाय `OrderBy की OrderByDescending() का उपयोग करके LINQ में आदेश को पलट सकता है()।

इसके अलावा, ध्यान दें कि आपको या तो परिणाम को पूरा करना होगा या OrderBy() विधि डिफ़ॉल्ट रूप से आलसी है। ऊपर दिया गया उदाहरण सूची की एक प्रति को पूरा करता है।

यदि आप सूची को क्रमबद्ध करना चाहते हैं (एक नया बनाने के बजाय), तो आप विधि पर Comparison<T> प्रतिनिधि को आपूर्ति कर सकते हैं।

list.Sort((a,b) => a.Item2.CompareTo(b.Item2)); 

हालांकि, अगर आप भी बेहतर कर सकते हैं - अगर आप कभी भी मुख्य करने के लिए क्रमबद्ध क्रम में सूची चाहते हैं, आप के बजाय SortedList वर्ग का उपयोग कर सकते हैं ... लेकिन आप उस मामले में एक कस्टम IComparer<Tuple<MediaItem, DateTime>> लागू करना होगा। इस मामले में, जब आप आइटम जोड़ते हैं तो वे हमेशा क्रमबद्ध क्रम में बनाए रखा जाएगा।

5

एक तरह से List<T>.Sort विधि का उपयोग करने, एक लैम्ब्डा अभिव्यक्ति का उपयोग कर उचित Comparison<T> प्रतिनिधि बनाने के लिए किया जाएगा।

// Sorts tuples in chronological order. To use reverse chronological order, 
// use t2.Item2.CompareTo(t1.Item2) instead. 
list.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2)); 

यह निश्चित रूप से मानता है कि सूची में कोई शून्य संदर्भ नहीं है, जो आपके उदाहरण में नहीं हो सकता है।

+0

+1 मुझे 30 सेकंड तक हराया ;-) – BrokenGlass

2
List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

for (int i = 0; i <= 10; i++) 
{ 
     DateTime date = new DateTime(2011, i, 1); 
     MediaItem item = new MediaItem(); 
     list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
} 

list.Sort((a, b) => a.Item2.CompareTo(b.Item2)); 

foreach (var element in list) 
{ 
    Console.WriteLine(element); 
}