2010-06-11 4 views
0

Je construis un mot programme anagram qui utilise une base de données qui contient une table simple:Besoin d'aide à la formulation requête LINQ

Words 
--------------------- 
varchar(15) alphagram 
varchar(15) anagram 
(other fields omitted for brevity) 

Un Alphagram est les lettres d'un mot par ordre alphabétique. Par exemple, l'alphagram pour OVERFLOW serait EFLOORVW. Chaque Alphagram dans ma base de données a un ou plusieurs Anagrammes. Voici un exemple vidage de données de ma table:

Alphagram Anagram 
EINORST  NORITES 
EINORST  OESTRIN 
EINORST  ORIENTS 
EINORST  STONIER 
ADEINRT  ANTIRED 
ADEINRT  DETRAIN 
ADEINRT  TRAINED 

Je suis en train de construire une requête LINQ qui renvoie une liste de Alphagrams ainsi que leurs anagrammes associés. Est-ce possible?


MISE À JOUR: Voici ma solution basée sur les suggestions ci-dessous! Merci a tous!

using (LexiconEntities ctx = new LexiconEntities()) 
{ 
    var words = ctx.words; 

    var query = 
     from word in words 
     where word.alphagram == "AEINRST" 
     group word by word.alphagram into alphagramGroup 
     select new { Alphagram = alphagramGroup.Key, Anagrams = alphagramGroup }; 

    foreach (var alphagramGroup in query) 
    { 
     Console.WriteLine("Alphagram: {0}", alphagramGroup.Alphagram); 
     foreach (var anagram in alphagramGroup.Anagrams) 
     { 
      Console.WriteLine("Anagram: {0}", anagram.word1); 
     } 
    } 
} 
+0

voulez-vous dire linq à SQL? –

+0

En fait, c'est une application Silverlight/RIA Services, donc je crois qu'il utilise Linq-to-Entities. Je suis un peu n00b avec ça. – eponymous23

+0

J'ai un Entity Data Model dans ma solution qui a été généré à partir de ma table de base de données. Mon modèle contient une entité appelée "Word" qui contient les propriétés "Alphagram" et "Anagram" (entre autres). Je pensais que c'était peut-être possible de faire une sorte de requête Linq auto-jointe. – eponymous23

Répondre

1

var list = anagrams.Select( 
    a => new { 
      Alphagram = a.ToCharArray().OrderBy(s => s).ToString(), 
      Anagram = a 
     }).toList(); 

Une réponse totalement nouvelle ...

Vous semblez avoir besoin d'un regard de requête groupby à How to: Group Data (Entity Framework).

cela devrait accomplir ce que vous voulez ...

J'ai fait un grincheux avec LINQ et cela fonctionne ...

var words = new List<Word>() 
    { 
     new ConsoleApplication1.Word("EINORST", "NORITES"), 
     new ConsoleApplication1.Word("EINORST", "OESTRIN"), 
     new ConsoleApplication1.Word("EINORST", "STONIER"), 
     new ConsoleApplication1.Word("ADEINRT", "ANTIRED"), 
     new ConsoleApplication1.Word("ADEINRT", "DETRAIN"), 
     new ConsoleApplication1.Word("ADEINRT", "TRAINED") 
    }; 

    var q = words.GroupBy(w => w.Alphagram).Select(w => new { Alphagram = w.Key, Anagrams = w.Select(p => p.Anagram).ToList() }).ToList(); 

    foreach (var item in q) 
    { 
     Console.WriteLine("Alphagram : {0}, Anagrams = {1}", item.Alphagram, String.Join(",", item.Anagrams)); 
    } 
+0

Le GroupBy était la clé! À votre santé! – eponymous23

0
var words = new List<Words>() 
    { 
     new Words("EINORST", "NORITES"), 
     new Words("EINORST", "OESTRIN"), 
     new Words("EINORST", "STONIER"), 
     new Words("ADEINRT", "ANTIRED"), 
     new Words("ADEINRT", "DETRAIN"), 
     new Words("ADEINRT", "TRAINED") 
    };  


    var result = words.GroupBy(w => w.Alphagram, w => w.Anagram) 
         .Select(w => new { 
              Alphagram = w.Key, 
              Anagrams = w.Where(p => w.Key.ToCharArray().SequenceEqualUnOrdered(p.ToCharArray())).ToList() 
             } 
          ) 
         .ToList(); 


public static bool SequenceEqualUnOrdered<T>(this IEnumerable<T> first, IEnumerable<T> second) 
{ 
    return new HashSet<T>(first).SetEquals(second); 
} 

Est-ce ce que vous cherchez? C'est LINQ to Objects. Vous pouvez utiliser LINQ-to-SQL ou LINQ-to-Entites pour récupérer vos enregistrements dans vos objets, puis utiliser la requête LINQ-to-Objects mentionnée ci-dessus sur la collection d'objets déjà récupérée.