2009-03-05 17 views
16

मैं Sybase की सूची() या MySQL के group_concat() करने के लिए LINQ समकक्ष के लिए देख रहा हूँ में कई पंक्तियों को श्रेणीबद्ध करने के लिएLINQ का प्रयोग करें एकल पंक्ति (CSV संपत्ति)

यह बदल देंगे:

User Hobby 
-------------- 
Bob Football 
Bob Golf 
Bob Tennis 
Sue Sleeping 
Sue Drinking 

करने के लिए:

User Hobby 
-------------- 
Bob Football, Golf, Tennis 
Sue Sleeping, Drinking 

उत्तर

17

GroupBy ऑपरेटर है कि। क्या आप LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं? आप आराम से अपने आप का प्रबंधन कर सकते हैं -

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

public class Test 
{ 
    static void Main() 
    { 
     var users = new[] 
     { 
      new { User="Bob", Hobby="Football" }, 
      new { User="Bob", Hobby="Golf" }, 
      new { User="Bob", Hobby="Tennis" }, 
      new { User="Sue", Hobby="Sleeping" }, 
      new { User="Sue", Hobby="Drinking" }, 
     }; 

     var groupedUsers = users.GroupBy(user => user.User); 

     foreach (var group in groupedUsers) 
     { 
      Console.WriteLine("{0}: ", group.Key); 
      foreach (var entry in group) 
      { 
       Console.WriteLine(" {0}", entry.Hobby); 
      } 
     } 
    } 
} 

कि समूह करता है:

यहाँ एक उदाहरण है? आपके प्रश्न के _concat पहलू फिर

List<User> users = new List<User>() 
{ 
    new User {Name = "Bob", Hobby = "Football" }, 
    new User {Name = "Bob", Hobby = "Golf"}, 
    new User {Name = "Bob", Hobby = "Tennis"}, 
    new User {Name = "Sue", Hobby = "Sleeping"}, 
    new User {Name = "Sue", Hobby = "Drinking"} 
}; 

var groupedUsers = from u in users 
     group u by u.Name into g 
     select new 
     { 
      Name = g.First<User>().Name, 
      Hobby = g.Select(u => u.Hobby) 
     }; 


foreach (var user in groupedUsers) 
{ 
    Console.WriteLine("Name: {0}", user.Name); 
    foreach (var hobby in user.Hobby) 
    { 
     Console.WriteLine("Hobby: {0}", hobby); 
    } 
} 
+2

यह भी साथ भीतरी पाश को बदलने के लिए संभव है 'String.Join (", ", group.ToArray())', जब तक तत्वों की संख्या बहुत बड़ी नहीं है। –

+0

धन्यवाद! मैं लगातार आपको लगातार बग करने के बजाय LINQ सीखने जा रहा हूं ;-) –

+8

क्या मैं अकेला हूं जिसने देखा कि आदमी खेल में है जबकि महिला के शौक सो रहे हैं और पी रहे हैं? आप जॉन स्कीट भयानक हैं! – Carter

5

अगर इस समाधान में मदद करता है देखें

Console.WriteLine("User:\tHobbies"); 
foreach (var group in groupedUsers) 
    Console.WriteLine("{0}:\t{1}", group.Key, group.Select(g => g.Hobby).AsJoined(", ")); 

... और आपको सटीक परिणाम आउटपुट प्रारूप मिलेगा जो आपने पूछा था आर (हाँ, मुझे पता है कि दूसरों ने आपकी समस्या को हल कर लिया है, लेकिन इसका विरोध करना मुश्किल है!)

4

का उपयोग कर,:

static class EnumerableExtensions 
{ 
    public static String AsJoined(this IEnumerable<String> enumerable) 
    { 
     return AsJoined(enumerable, ","); 
    } 

    public static String AsJoined(this IEnumerable<String> enumerable, String separator) 
    { 
     return String.Join(separator, enumerable.ToArray()); 
    } 
} 

ब्रूनो Conde और जॉन स्कीट के जवाब में outputting foreach बन सकता है:

+0

यह MySQL के 'GROUP_CONCAT' फ़ंक्शन की तरह है। उपयोगी। –

+0

@Moshe LI इन दिनों अनुमान लगाता है कि मैं 'समूह को प्रतिस्थापित कर सकता हूं। चयन करें (g => g. शौक)। "स्ट्रिंग। जॉइन (", ", समूह में जी से g.Hobby) के साथ जुड़ा हुआ (", ")' ' (इसके लिए 'String.Join' के अधिभार की आवश्यकता होती है जो' IENumerable 'लेता है, जिसे .NET 4.0) –

+0

में पेश किया गया था या केवल 3.5 'समूह पर उपयोग करें। चयन करें (g => g. शौक)। ToArray()'। –

2

इसे एक लिंक कथन में करने के लिए। कोड का अनुशंसा करने का कोई तरीका नहीं है, लेकिन यह दिखाता है कि यह किया जा सकता है।

  var groupedUsers = from user in users 
          group user by user.User into userGroup 
          select new 
          { 
           User = userGroup.Key, 
           userHobies = 
            userGroup.Aggregate((a, b) => 
             new { User = a.User, Hobby = (a.Hobby + ", " + b.Hobby) }).Hobby 
          } 
          ; 
     foreach (var x in groupedUsers) 
     { 
      Debug.WriteLine(String.Format("{0} {1}", x.User, x.userHobies)); 
     } 
3

वरना हम following-

var users = new[] 
       { 
       new { User="Bob", Hobby="Football" }, 
       new { User="Bob", Hobby="Golf" }, 
       new { User="Bob", Hobby="Tennis" }, 
       new { User="Sue", Hobby="Sleeping" }, 
       new { User="Sue", Hobby="Drinking" }, 
       }; 

       var userList = users.ToList(); 
       var ug = (from user in users 
          group user by user.User into groupedUserList 
          select new { user = groupedUserList.Key, hobby = groupedUserList.Select(g =>g.Hobby)}); 

       var ug2 = (from groupeduser in ug 
          select new{ groupeduser.user, hobby =string.Join(",", groupeduser.hobby)}); 
-1

सभी जवाब कर सकते हैं काफी अच्छा नहीं है,

क्योंकि यह एक डीबी क्वेरी है, लेकिन हम सभी इसे स्मृति में करते हैं;

diff यह है कि स्मृति में कुछ ऑपरेशन एक त्रुटि उत्पन्न करेगा अभिव्यक्ति को स्टोर करने के लिए ट्रांस नहीं कर सकता;

var list = db.Users.GroupBy(s=>s.User). 
      select(g=>new{user=g.Key,hobbys=g.select(s=>s.Hobby)}); // you can just do that from db 

var result=list.ToList(); // this is important,to query data to memory; 

var result2 = result.select(g=>new{user=g.Key,hobbyes=string.join(",",g.hobbyes)}; //then,do what you love in memory 
संबंधित मुद्दे