2012-05-30 9 views
5

人名とその出身地を含むオブジェクトがあるとします。CでLINQを使用してグループ化されたリストの組み合わせを検索する#

public class personDetails 
{ 
    public string City; 
    public string Name; 
} 

また、次のエントリが追加されたリストがあります。

Name City 
John | London 
Jane | London 
Tom | New York 
Bob | New York 
Fred | New York 

私が探しているのは、都市別に分類されたすべての名前の組み合わせです。

John Tom 
John Bob 
John Fred 
Jane Tom 
Jane Bob 
Jane Fred 

私は事前にグループの数を知っていれば、私はしかし、これが唯一の私は、事前にグループの数を知っていれば動作し、すぐに次のコード

List<personDetails> personList = new List<personDetails>(); 
//populate list 

var groupedPersons = personList.GroupBy(c => c.City); 
foreach (var item1 in groupedPersons[0]) 
{ 
    foreach (var item2 in groupedPersons[1]) 
    { 
     Console.WriteLine(item1.Name + " " + item2.Name); 
    }   
} 

を使用することにより、これを行うことができますグループの量が大きくなると扱いにくくなります。私はLINQを使ってこれを行うエレガントな方法があると確信しています。だれかが光を当てることができますか?

+0

はこの答えhttp://stackoverflow.com/questions/9168269/permutation-algorithms-in-c-sharpを見てみましょう。あなたはあなた自身のリストに参加することができます。 – Brad

+0

@Bradこれは、2つの都市でリストされている例ではうまくいくでしょう。 OPが望んでいるのは、N次元のクロス積であり、Nは実行時まで知られていない。そのコードスニペットはそれを提供しません。 – Servy

答えて

3

次のコードスニペットは、hereから始まります。 (それは良いリンク、読みに​​値する)です。その後

public static class MyExtensions 
{ 
    public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
    { 
     IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
     return sequences.Aggregate(
      emptyProduct, 
      (accumulator, sequence) => 
      from accseq in accumulator 
      from item in sequence 
      select accseq.Concat(new[] { item })); 
    } 
} 

私たちが行う必要があるのは次のとおりです。

var groupedPersons = personList.GroupBy(c => c.City) 
    //need an enumerable of enumerables, not an enumerable of groupings, 
    //because the method isn't covariant. 
    .Select(group => group.AsEnumerable()); 

var results = groupedPersons.CartesianProduct(); 
foreach (var group in results) 
{ 
    foreach (var person in group) 
    { 
     Console.Write(person.Name + " "); 
    } 
    System.Console.WriteLine(); 
} 
+0

あなたが提供したデータを入力した後でそれをテストし、期待される結果を印刷します。 – Servy

+0

素晴らしい、素晴らしい作品です。そして、非常に興味深いブートのリンク、多くのありがとう。 – John

関連する問題