2011-01-01 17 views
1

Ich habe diese Klasse:Container mit Linq + Gruppe abfragen?

public class ItemList 
{ 
    public int GuID { get; set; } 
    public int ItemID { get; set; } 
    public string Name { get; set; } 
    public entityType Status { get; set; } 
    public int Zone { get; set; } 

    public class Waypoint 
    { 
     public int SubID { get; set; } 
     public int Heading { get; set; } 
     public float PosX { get; set; } 
     public float PosY { get; set; } 
     public float PosZ { get; set; } 
    } 
    public List<Waypoint> Routes = new List<Waypoint>(); 
} 

, die auf dieser Liste verwendet wird: public List myList = new List();

Neue Elemente hinzugefügt werden ist wie folgt:

ItemList newItem = new ItemList(); 
newItem.GUID = GUID; 
newItem.ItemID = ItemID; 
newItem.Name = Name; 
newItem.Status = Status; 

// Inner Routes List 
ItemList.Waypoint itemLocation = new ItemList.Waypoint(); 
itemLocation.SubID = SubID; 
itemLocation.Zone = Zone; 
itemLocation.Heading = convertHeading(Heading); 
itemLocation.PosX = PosX; 
itemLocation.PosY = PosY; 
itemLocation.PosZ = PosZ; 
itemLocation.Rest = Rest; 
newItem.Routes.Add(itemLocation); 
myList.Add(newItem); 

Jetzt muss ich zu einer Gruppe durch ItemID und kommen Sie den ersten Eintrag von Routen jedes iqual ItemID.

Dies wäre ein Beispiel für public List<ItemList> myList = new List<ItemList>(); Daten sein:

GUID ItemID  ListOfRoutes 
    1  20  GUID_1_Routes 
    2  20  GUID_2_Routes 
    3  20  GUID_3_Routes 
    4  20  GUID_4_Routes 
    5  20  GUID_5_Routes 
    6  55  GUID_6_Routes 
    7  55  GUID_7_Routes 
    8  55  GUID_8_Routes 
    9   1  GUID_9_Routes 
    10   1  GUID_10_Routes 

Wie Sie GUID ist einzigartig sehen kann, ist es ItemID kann selbst reapeat. Jede GUID hat eine Routenliste und alle Routenlisten haben mindestens 1 Eintrag und mehr.

Routen ist Teil der Klasse public List<Waypoint> Routes = new List<Waypoint>(); ItemList Beispiel

Routen.

GUID_1_Routes haben:

Entry Zone SubID Heading  PosX PosY PosZ 
    1 1200  0  100  1029.32 837.21 29.10 
    2 1200  0  120  1129.32 537.21 29.10 
    3 1200  0  180  1229.32 137.21 29.10 
    4 1200  0  360  1329.32 437.21 29.10 
    5 1200  0  100  1429.32 637.21 29.10 

GUID_2_Routes haben:

Entry Zone SubID Heading  PosX PosY PosZ 
    1 100  0  10  129.32 437.21 29.10 

Also, was soll ich eine Liste aller Einträge tun ist, ich auf myList von ItemID maintainning die Felder ItemID und Namen gruppiert haben ... und eine neue Liste pro ItemID, die das erste Element jedes Routes von jeder GUID mit derselben ItemID speichert.

Zum Beispiel ItemID 20 würde die Folge Ergebnis führt:

ItemID, Name ListOfRoutes

Diese ItemID ListOfRoutes

GUID_1_Routes ersten Eintrag enthalten würde:

Entry Zone SubID Heading  PosX PosY PosZ 
    1 1200  0  100  1029.32 837.21 29.10 

GUID_2_Routes ersten Eintrag :

Entry Zone SubID Heading  PosX PosY PosZ 
    1 100  0  10  129.32 437.21 29.10 

GUID_3_Routes, GUID_4_Routes, GUID_5_Routes erste Einträge.

UPDATE2:

Dies ist, wie ich die Ergebnisse zu erhalten, haben es geschafft, ich wollte, aber ich glaube es immer noch dann mit einer einzigen Abfrage oder in einer besseren Art und Weise möglich wäre, was ich zur Zeit bin mit:

 var query = from ItemList item in myList 
        where status.Contains(item.Status) 
        group item by new 
        { 
         item.ItemID, 
         item.Name, 
         item.Zone 
        } 
        into newList 
        orderby newList.Key.ItemID ascending 
        select new 
        { 
         newList.Key.ItemID, 
         newList.Key.Name, 
         newList.Key.Zone 
        }; 

     foreach (var thisItem in query) 
     { 
       var location = from n in myList 
           where n.ItemID == thisItem.ItemID 
           select new 
           { 
            Routes = n.Routes.First() 
           }; 
       foreach (var thisObject in location) 
       { 
        ItemList.Waypoint thisRoutes = thisObject.Routes; 
       } 
     } 

Antwort

2

Was Sie suchen, ist eine Variante von dem, was ich in der ersten Abfrage hatte. Ich bin immer noch nicht 100% ig sicher, dass ich deine Erklärung verstanden habe, aber basierend auf deiner Ausgabe glaube ich, dass das mehr von dem ist, was du versucht hast.

Ich war nicht sicher über welchen Typ Sie für die Liste wollten, ändern Sie es wie nötig.

+0

Zuerst ein frohes neues Jahr und danke für die Antwort Ich werde es versuchen, mehr jedes Element in der öffentlichen Liste zu erklären myList = neue Liste (); ', die die Klasse innerhalb der Liste der Routen' öffentliche Liste hat Routen = neue Liste (); 'aber einige Elemente haben mehr als 1 Route und ich brauche genau den ersten Eintrag jedes Elements. – Prix

+0

@Prim: Klingt für mich wie die erste Abfrage, was Sie dann suchen. –

+0

@Jeff M unglücklich Ich bin nicht in der Lage, das oben zu Pratice in die aktuelle Klasse, die ich habe und die daraus resultierende Abfrage brauche ich auch die – Prix

2
  • In Ihrer Frage sagen Sie: "Von jeder GUID, die die gleiche ItemID hatte."
  • In Ihrem Arbeitscode verwenden Sie überhaupt keine GUID.

-

  • In Ihrer Frage erwähnen Sie nicht den Status Filterung.
  • In Ihrem Arbeitscode gibt es Status-Filterung.

-

Wie auch immer, ich habe den "Arbeitscode" auf ein paar Zeilen eingekocht.

from ItemList item in myList 
where status.Contains(item.status) 
group item by item.ItemID into groupedItems 
order by groupedItems.Key descending 
let firstItem = groupedItems.First() 
let routes = 
    from item2 in groupedItems 
    select item2.Routes.First() 
from route in routes 
select new 
{ 
    TheItemList = firstItem, 
    TheWayPoint = route 
}; 

Sie müssen lernen, wie Sie das Ergebnis der Gruppe nach Operationen abfragen können. Im obigen Code habe ich das erste Element aus jeder Gruppe extrahiert, und ich habe jedes Element der Gruppe projiziert und dann auf dieser Projektion verbunden.

Sie sollten auch besser kommunizieren, was jeder Schlüssel identifiziert, warum es doppelte Element-IDs in der Liste gibt und warum eine Klasse namens ItemList überhaupt keine Liste ist.

+0

Vielen Dank für die Antwort und ein frohes neues Jahr für Sie;), Ich werde Ihre Anfrage in ein paar versuchen. Über die GUID, ist es, weil, wenn ich es durch ItemID gruppieren, es nicht notwendig ist, nach der GUID zu suchen, aber Sie können sehen, dass jede GUID eine Routenliste hat und von dieser Routenliste brauche ich nur das erste Element. Wenn ItemID 20 also 5 GUID-Einträge hat, wird es eine Routenliste mit 5 Elementen haben, die das erste Element jeder GUID ist, die die ItemID enthält – Prix