2009-09-29 10 views
11

द्वारा असंवेदनशील समूह में मेरे पास डेटा तालिका है और मैं डेटा तालिका के कॉलम पर एक केस असंवेदनशील समूह करना चाहता हूं (टाइप स्ट्रिंग के कहें)। मैंने देखा कि आमतौर पर LINQ से डेटासेट एक केस संवेदनशील तुलना करता है। उदाहरण के लिए, में दो स्ट्रिंग मान "टेस्ट" और "टेस्ट" हैं, group by लागू करने के बाद यह एक के बजाय "टेस्ट" और "टेस्ट" मानों के साथ दो अलग-अलग पंक्तियां देता है।LINQ से डेटासेट केस

क्वेरी है:

var countGroupQuery = from table in dataTable.AsEnumerable() 
         group table by table.Field<string>(Column1) into groupedTable 
         select new 
         { 
          value = groupedTable.Key, 
          count = groupedTable.Count() 
         }; 

वहाँ प्रदर्शन करने के लिए कोई भी तरीका है एक केस-संवेदी group by ताकि ऊपर के उदाहरण मैं एक मूल्य (या तो "टेस्ट" या "परीक्षण") के साथ केवल एक पंक्ति पाने में ? ToUpper या ToLower वास्तव में इनपुट मानों की कम से कम एक उपयोग करने के बजाय या तो अपर केस या लोअर केस को मान बदल जाएगा, इसलिए मैं इस का उपयोग नहीं करना चाहते हैं:

group table by table.Field<string>(Column1).ToUpper() into groupedTable 
+1

आपका हाल ही के संपादन, [अनुचित] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) और कर रहे हैं उन पदों की आयु दी गई है जिन्हें आप उन्हें लागू कर रहे हैं, संभावित स्पैम। कृपया निराश करें। –

उत्तर

22

आप एक प्रश्न अभिव्यक्ति से ऐसा नहीं कर सकते, लेकिन आप डॉट नोटेशन के साथ यह कर सकते हैं:

var query = dataTable.AsEnumerable() 
        .GroupBy(x => table.Field<string>(Column1), 
           StringComparer.InvariantCultureIgnoreCase) 
        .Select(groupedTable => new 
          { 
           value = groupedTable.Key, 
           count = groupedTable.Count() 
          }); 

तुम भी GroupBy का एक और अधिक जटिल अधिभार उपयोग कर सकते हैं एक कॉल में यह करने के लिए:

var query = dataTable.AsEnumerable() 
        .GroupBy(x => table.Field<string>(Column1), 
           (key, group) => { value = key, 
               count = group.Count() }, 
           StringComparer.InvariantCultureIgnoreCase)); 

स्पष्ट रूप से इनवेरिएंट संस्कृति का उपयोग कर रहा है - आप वर्तमान संस्कृति या सामान्य नियमों का भी उपयोग कर सकते हैं।

+1

Thanx। यही है जिसकी मेरे द्वारा तलाश की जा रही है!!! वैसे यदि मैं एक से अधिक कॉलम (कॉलम 1 और कॉलम 2) पर समूह को लागू करना चाहता हूं तो यह क्वेरी कैसा दिखना चाहिए ?? – Anoop

+0

@ एनोप: एक से अधिक स्तंभों द्वारा समूहित करना * और * मामले-असंवेदनशील तरीके से ऐसा करना मुश्किल होगा। आप शायद उस कस्टम प्रकार के निर्माण को बंद कर दें, जिसमें आप रुचि रखने वाले कॉलम और बराबर ओवरराइड कर रहे हों। –

+0

जॉन! क्या आप इसे थोड़ा और विस्तृत तरीके से समझा सकते हैं ?? – Anoop

3

यह MSDN article डेटासेट बारे में कुछ जानकारी है और मामले की संवेदनशीलता ..

आप खोज, और डेटासेट के CaseSensitive संपत्ति की स्थापना द्वारा छँटाई, छानने के मामले संवेदनशीलता नियंत्रित कर सकते हैं।

+0

मेरे मामले में डेटाटेबल डेटासेट से स्वतंत्र है, इसलिए केस संवेदनशील संपत्ति को गलत पर सेट किया गया है। मुझे लगता है कि लिंकक इस संपत्ति का संदर्भ नहीं देता है। यह डेटासेट/डाटाटेबल क्लास द्वारा पेश किए गए संचालन के लिए है। – Anoop

+0

डेटाटेबल में संपत्ति भी है। लेकिन ईमानदारी से मैंने LINQ का उपयोग डेटासेट/तालिकाओं के साथ संवाद करने के लिए नहीं किया है, इसलिए मैं यह नहीं कह सकता कि वास्तव में इसका असर होगा या नहीं। –

+0

यह मेरे लिए काम नहीं करता है। क्या आपने LINQ के साथ कोशिश की? उत्तर के लिए – Bryan

0
var query = dt.AsEnumerable() 
       .GroupBy(r => r.Field<string>("Mes")) 
       .Select(g => new { Mes = g.Key, 
           Tns = g.Sum(s => Convert.ToDecimal(s.Field<string>("Tns"))) }) 
       .OrderBy(g => g.Mes.First()) 
       .Where(g => g.Mes == ddlMes.SelectedValue.ToString()); 
संबंधित मुद्दे