2008-09-30 10 views

उत्तर

2

आप कुशलता से वस्तुओं के लिए वेनिला LINQ में कई समुच्चय नहीं चुन सकते। आप निश्चित रूप से कई प्रश्न कर सकते हैं, लेकिन यह आपके डेटा स्रोत के आधार पर अक्षम हो सकता है।

मैं एक रूपरेखा जो इस जो मैं कॉल "LINQ पुश" के साथ तालमेल बिठाता है - यह केवल एक शौक (मुझे और मार्क Gravell के लिए) है, लेकिन हमें विश्वास है कि यह बहुत अच्छी तरह से काम करता है। यह MiscUtil के हिस्से के रूप में उपलब्ध है, और आप इसके बारे में my blog post on it में पढ़ सकते हैं।

यह थोड़ा अजीब दिखता है - क्योंकि आप परिभाषित करते हैं कि आप कहां "वायदा" के रूप में जाना चाहते हैं, फिर क्वेरी के माध्यम से डेटा को दबाएं, फिर परिणामों को पुनर्प्राप्त करें - लेकिन एक बार जब आप अपना सिर ले लेंगे, तो यह ठीक है। मुझे यह जानने में दिलचस्पी होगी कि आप इसके साथ कैसे चलते हैं - यदि आप इसका उपयोग करते हैं, तो कृपया मुझे [email protected] पर मेल करें।

+0

धन्यवाद जॉन। लिंकक के बारे में सबसे कठिन भागों में से एक यह पता लगा रहा है कि आप क्या कर सकते हैं और नहीं कर सकते हैं। मानक पद्धति के साथ थोड़ा और अधिक आरामदायक होने के बाद मैं निश्चित रूप से आपकी पुश तकनीक पर एक नज़र डालूंगा। –

4

एकल गणना प्रत्येक न्यूनतम और अधिकतम (और कोई अन्य कुल जो आप वहां फेंकना चाहते हैं) प्रदान करते हैं। यह vb.net में बहुत आसान है।

मुझे पता है कि यह खाली मामला संभाल नहीं करता है। यह जोड़ना बहुत आसान है।

List<int> myInts = new List<int>() { 1, 4, 2, 0, 3 }; 
    var y = myInts.Aggregate(
     new { Min = int.MaxValue, Max = int.MinValue }, 
     (a, i) => 
     new 
     { 
      Min = (i < a.Min) ? i : a.Min, 
      Max = (a.Max < i) ? i : a.Max 
     }); 
    Console.WriteLine("{0} {1}", y.Min, y.Max); 
+0

यह थोड़ा सा मैनुअल है लेकिन यह मेरे लिए काफी अच्छा है। यह मजेदार है कि जब आप linq को तोड़ते हैं तो आप तुरंत फोरच लुक के लिए सिंटैक्टिक शॉर्टकट पर वापस आते हैं। –

+0

तब पुरानी है, है ना? foreach सिर्फ एक वाक्य रचना शॉर्टकट है। –

+0

डाउनवॉटर, टिप्पणी करने की देखभाल? –

0

LINQ-to-Objects के साथ कई समेकन करना संभव है, लेकिन यह थोड़ा बदसूरत है।

var times = punches.Aggregate(
    new { EarliestIn = default(DateTime?), LatestOut = default(DateTime?) }, 
    (agg, p) => new { 
     EarliestIn = Min(
      agg.EarliestIn, 
      p.type == "In" ? (DateTime?)p.PunchTime : default(DateTime?)), 
     LatestOut = Max(
      agg.LatestOut, 
      p.type == "Out" ? (DateTime?)p.PunchTime : default(DateTime?)) 
    } 
); 

तुम भी दिनांक समय के लिए न्यूनतम और अधिकतम कार्यों की जरूरत है, क्योंकि इन उपलब्ध मानक नहीं हैं।

public static DateTime? Max(DateTime? d1, DateTime? d2) 
{ 
    if (!d1.HasValue) 
     return d2; 
    if (!d2.HasValue) 
     return d1; 
    return d1.Value > d2.Value ? d1 : d2; 
} 
public static DateTime? Min(DateTime? d1, DateTime? d2) 
{ 
    if (!d1.HasValue) 
     return d2; 
    if (!d2.HasValue) 
     return d1; 
    return d1.Value < d2.Value ? d1 : d2; 
}