Сортировка списка объектов с .notation на основе внутреннего списка - PullRequest
2 голосов
/ 15 марта 2011

У меня есть эти классы:

[DataContract]
public class RowData
{
    [DataMember]
    public string ID { get; set; }
    [DataMember]
    public string AccountName { get; set; }
    [DataMember]
    public string AuthServerName { get; set; }
    [DataMember]
    public string SecurityName { get; set; }
    [DataMember]
    public string LastUser { get; set; }
    [DataMember]
    public string Status { get; set; }
    [DataMember]
    public string ClaimRelease { get; set; }
    [DataMember]
    public List<GameItem> Games { get; set; }
}

[DataContract]
public class GameItem
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Version { get; set; }
}

Я поставил наиболее вероятный нерабочий вопрос о том, как это «должно» выглядеть, если бы я знал, что делаю.

public List<RowData> GetSortedByColumnList(Entities db, int ColumnID, string direction, int GameCount, List<RowData> rows)
{
...
    else if ((ColumnID > 3) && (ColumnID < GameCount + 4))
    {
        List<Game> gameslist = db.Games
            .Where(x => x.GameIsActive == 1)
            .ToList(); // Game has the key names

        int index = (ColumnID - GameCount) - 1; 

        // gamename is the name that i'd like to match for sorting purposes.
        string gamename = gameslist[index].GameName; 

        // *** LOOK HERE ****
        List<RowData> sortedList = rows
            .OrderBy(x => x.Games
                .Min(Games => Games.Version)
                .Where(Games => Games.Name == gamename))
            .ToList();

    rows = sortedList;
}

Это пример того, как будут выглядеть строки:

rows[0].id = 1
...
rows[0].Games[0].Name="A0"
rows[0].Games[0].Version=3
rows[0].Games[1].Name="B0"
rows[0].Games[1].Version=4

rows[1].id = 2
...
rows[1].Games[0].Name="A0"
rows[1].Games[0].Version=1
rows[0].Games[1].Name="B0"
rows[0].Games[1].Version=2

rows[2].id = 3
...
rows[2].Games[0].Name="A0"
rows[2].Games[0].Version=5

Таким образом, если строка gamename будет равна "B0", и мне нужно, чтобы список сортировался по номеру версии, так что порядок сортировки будет следующим: row [1], row [2], row [3]. Обратите внимание, что в строках [2] нет B0.

Как я могу изменить запрос в // *** LOOK HERE ****, чтобы список сортировался так, как я хочу?

Ошибка компиляции 1 'char' не содержит определения для 'Name', и не найдено никакого метода расширения 'Name', принимающего первый аргумент типа 'char' (вы пропустили директиву using или ссылку на сборку?)

1 Ответ

2 голосов
/ 16 марта 2011

Предполагая, что вы ищете запрос, который вернет список игр с определенным названием в порядке версии, вы, вероятно, ищете что-то похожее на приведенное ниже:

List<GameItem> sortedList = rows
    .SelectMany(r => r.Games) // flattens to an ienumerable of games
    .Where(g => g.Name == gameName) // filters by the game name
    .OrderBy(g => g.Version) // orders by the game's version
    .ToList(); // converts the ienumerable to a list (of games).

Если вы хотелиList<RowData> вместо этого, и мы можем предположить, что есть только 1 игра с определенным именем в строке, вы можете сделать что-то вроде ниже:

// delegate for generating orderby key    
Func<RowData, string, int> sortKey = (r, gn) =>
{
    var game = r.Games.FirstOrDefault(g => g.Name == gn);
    return game != null ? game.Version : int.MaxValue; // or "zzzzz" if version is a string (something to put it to the end of the list)
};

List<RowData> result = rows
    .OrderBy(r => sortKey(r, gameName))
    .ToList();
...