2016-06-29 4 views
0

Ich habe ein IQueryable und möchte das in ein Dictionary stopfen, das den Foo als Schlüssel hat, und die Zählung der Foo's Bars-Sammlung als Wert.Zwei IQueryables in ein Dictionary mit LINQ verschmelzen

public class Foo 
{ 
    public string ID { get; set; } 
    public ICollection<Bar> Bars { get; set; } 
} 

So würde die Ausgabe wie folgt aussehen:

new Dictionary<Foo, int> 
{ 
    { someFoo, 2 }, 
    { anotherFoo, 6 }, 
    ... 
} 

Und ich brauche diese von der IQueryable gerade zu tun, ohne Iterieren über die eigentlichen Objekte. Um es klar, ich nicht wollen, dies zu tun:

// given some IQueryable<Foo> called 'foos' and some Dictionary<Foo, int> called 'dictionary' 
foreach (var foo in foos.ToList()) 
{ 
    dictionary.Add(foo, foo.Bars.Count()); 
} 

Dinge, die ich habe versucht, die nicht funktionierten

METHODE 1

var dictionary = foos.ToDictionary(key => key, value => foos.Select(foo => foo.Bars.Count)); 

METHODE 2

var counts = foos.Select(foo => foo.Bars.Count); 

for (var i = 0; i < foos.Count(); i++) 
{ 
     dictionary.Add(foos.ElementAt(i), counts.ElementAt(i)); 
} 
+0

Es gibt keine Möglichkeit zu vermeiden, den Enumerable aufzuzählen, wenn Sie die Anzahl der Auflistung abrufen möchten. –

+0

Ich bin nicht klar auf Ihre Einschränkung. Was meinst du mit "nicht über die tatsächlichen Objekte iterieren"? 'ToDictionary' iteriert - Sie können kein Dictionary ohne Iteration erstellen, es ist kein lazy-evaluiertes Objekt wie IQueryable. – Blorgbeard

Antwort

1

Ich bin mir ziemlich sicher, dass dies w Ould Arbeit, haben Sie versucht, diesen:

var dictionary = foos.ToDictionary(foo => foo, foo => foo.Bars.Count()); 
0

Ah, endete dies oben arbeiten:

var result = from foo in foos 
      select new 
      { 
       Foo = foo, 
       Count = foo.Bars.Count() 
      }; 

Diese Methode hat auch den zusätzlichen Nutzen meinen Namen des Feldes angeben zu lassen, die für schön wenn ich dieses Objekt zu JSON serialisieren.

+0

OK. Kein Wörterbuch, aber .. – Blorgbeard

Verwandte Themen