tags:

views:

54

answers:

5

Hello, I have the following list :

UserName  LanguageSpoken
-------------------------
Bob       English
Bob       French
Alan      Italian
Alan      Spanish
Alan      German

I'd like to have another list like :

Bob       English/French
Alan      Italian/Spanish/German

How can I do that using lambda expressions in C#.

Thanks

+2  A: 

My approach would be to use a regex to parse the data and then linq to group it. Can you show us what you have tried so far?

Christopherous 5000
+1  A: 

If your List is something like:

class Person
{
    public string Name { get; set; }
    public string Language { get; set; }
}

List<Person> myList = /* Initialization */

Then LINQ GroupBy should do the trick:

myList.GroupBy(a => a.Name);

Hope this helps.

AS-CII
+2  A: 

Below is an implementation that you can play around with.

class UserLanguage
{
    public string UserName { get; set; }

    public string Language { get; set; }
}

static class EnumerableExtensions
{
    public static string Concatenate(this IEnumerable<string> source, string delimiter)
    {
        using (var enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                StringBuilder builder = new StringBuilder(enumerator.Current);
                while (enumerator.MoveNext())
                {
                    builder.Append(delimiter).Append(enumerator.Current);
                }
                return builder.ToString();
            }
            else
            {
                return null;
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // assuming that you already have data stored in a structure similar to this
        var rawData = new List<UserLanguage>()
        {
            new UserLanguage { UserName = "Bob", Language = "English" },
            new UserLanguage { UserName = "Bob", Language = "French" },
            new UserLanguage { UserName = "Alan", Language = "Italian" },
            new UserLanguage { UserName = "Alan", Language = "Spanish" },
            new UserLanguage { UserName = "Alan", Language = "German" },
        };

        // group these objects together by UserName
        var groupedData = rawData.GroupBy(userLanguage => userLanguage.UserName);

        foreach (var grouping in groupedData)
        {
            Console.WriteLine(grouping.Key + "\t" + grouping.Select(userLanguage => userLanguage.Language).Concatenate("/"));
        }
    }
}
Dr. Wily's Apprentice
+2  A: 
     class Person
        {
         string UserName {get;set;}
         string LanguageSpoken {get; set;}    
        }

    List<Person> Table = new List<Person>()
    { new Person(){UserName="Bob"; LanguageSpoken = "English"}
    /* next persons*/
    };

var UserNameGruops = from n in Table
        group n by n.UserName into g
        select new { keyUserName = g.Key, LanguageSpoken = g };

    foreach (var g in numberGroups)
    {
        Console.Write(g.keyUserName.ToString());
        foreach (var n in g.LanguageSpoken)
        {
            Console.WriteLine(n.ToString());
        }
    }
us50
A: 

Thank you very much