У меня есть этот класс:
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>();
}
Что используется в этом списке: public List myList = new List();
Новые элементы добавляются так:
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);
Теперь мне нужно сгруппировать его по ItemID и присоединиться к первой записи маршрутов каждого равного ItemID.
Это будет пример данных public List<ItemList> myList = new List<ItemList>();
:
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 GUIDpublic List<Waypoint> Routes = new List<Waypoint>();
Routes
6 55 GUIDEntry 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
Routes
7 55 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
Routes
8 55 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 1200 0 100 1029.32 837.21 29.10
Routes
9 1 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
Routes
10 1 GUID 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;
}
}
Routes
Как видите, GUID уникален, ItemID может повторяться сам. Каждый GUID имеет список маршрутов, и все списки маршрутов содержат как минимум 1 запись и выше.
Маршруты являются частью класса ItemList public List<Waypoint> Routes = new List<Waypoint>();
Пример маршрутов.
GUID
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>();
}
Routes имеют:
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
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);
Routes имеют:
Entry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
Итак, что я хочу сделать, это список всех записей, которые у меня есть в myList, сгруппированные по ItemID, поддерживающие поля ItemID и Name... и новый список для каждого ItemID, в котором будет храниться первый элемент каждого маршрута из каждого GUID, который имел тот же ID товара.
Например, ItemID 20 даст следующий результат:
ItemID, Имя, ListOfRoutes
Этот ItemID ListOfRoutes будет содержать
GUID
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>();
}
Routes первая запись:
Entry Zone SubID Heading PosX PosY PosZ
1 1200 0 100 1029.32 837.21 29.10
Первая запись GUID
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);
Routes:
Entry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
GUIDpublic List<ItemList> myList = new List<ItemList>();
Routes, GUID
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 GUIDpublic List<Waypoint> Routes = new List<Waypoint>();
Routes
6 55 GUIDEntry 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
Routes
7 55 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
Routes
8 55 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 1200 0 100 1029.32 837.21 29.10
Routes
9 1 GUIDEntry Zone SubID Heading PosX PosY PosZ
1 100 0 10 129.32 437.21 29.10
Routes
10 1 GUID 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;
}
}
Routes
Routes, GUIDpublic List<Waypoint> Routes = new List<Waypoint>();
Routes первые записи.
ОБНОВЛЕНИЕ 2:
Вот как мне удалось получить желаемые результаты, но я все еще верю, что это возможно с помощью одного запроса или лучше, чем то, что я сейчас использую:
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;
}
}