C # List - создание рейтинга из списка объектов

Вы не первый, кто попал в знаменитую «задержанную ловушку расширения» (и вы не станете последним)

Вам нужно задержать расширение, если вы хотите использовать переменную, что вы изменен в том же блоке (блок представляет собой последовательность команд в скобках ( и ))

Отложенные переменные ссылаются на !var! вместо %var%

Причина в том, что cmd анализирует код. Полная строка или блок анализируется сразу, заменяя обычные переменные своим значением во время разбора. Отложенные переменные оцениваются во время выполнения.

Две простые партии для демонстрации:

setlocal enabledelayedexpansion
set "var=hello"
if 1==1 (
  set "var=world"
  echo %var% !var!
)

.

setlocal enabledelayedexpansion
for /L %%i in (1,1,5) do (
  echo %random% !random!
)

Примечание: также строка рассматривается как block:

set "var=old"
set "var=new" & echo %var% 

с задержкой расширения:

setlocal enabledelayedexpansion
set "var=old"
set "var=new" & echo !var! 

Отсроченное расширение по умолчанию отключено в командной строке. Если вам это действительно нужно, вы можете сделать:

cmd /v:on /c "set "var=hello" & echo !var!"

Также есть способ сделать то же самое без задержки расширения (но call стоит некоторое время, поэтому он медленнее, но если по какой-то причине вы не можете / не хотите использовать замедленное расширение, это альтернатива):

setlocal DISabledelayedexpansion
for /L %%i in (1,1,5) do (
  call echo %random% %%random%% 
)

Оба метода могут использоваться для отображения переменных типа массива :

setlocal ENabledelayedexpansion
set "num=4"
set "var[%num%]=hello"
echo !var[%num%]!

или

setlocal DISabledelayedexpansion
set "num=4"
set "var[%num%]=hello"
call echo %%var[%num%]%%

(этого часто задают как «переменная, которая содержит другую переменную» или «вложенные переменные»

-2
задан Ladislau Strifler 22 March 2019 в 13:44
поделиться

1 ответ

Поскольку вы отредактировали свое сообщение и показали попытку решить проблему, я помогу вам. Передайте любую коллекцию игроков в эту функцию, чтобы получить новую коллекцию игроков в том формате, который вы запрашивали.

Примечание. Эта функция изменяет ссылки Player в переданных IEnumerable<Player>. Если по какой-либо причине вы не хотите использовать это поведение, просто замените Player = player на Player = new Player { Name = player.Name, Points = player.Points }, чтобы скопировать их.

using System;
using System.Linq;
using System.Collections.Generic;

public static IEnumerable<Player> GetGroupedPlayers(IEnumerable<Player> players)
{
    return players
    .OrderByDescending(player => player.Points)
    .Select((player, index) =>
    new
    {
        Player = player,
        Rank = ++index
    })
    .GroupBy(container => container.Player.Points)
    .Select(group =>
    {
        var firstPlayer = group.First().Player;
        var groupMin = group.Min(container => container.Rank);
        var groupMax = group.Max(container => container.Rank);
        firstPlayer.Rank = groupMin == groupMax ? $"{groupMin}." : $"{groupMin} - {groupMax}.";
        return group.Select(g => g.Player);
    })
    .SelectMany(player => player);
}

Надеюсь, это поможет.

0
ответ дан Darren Ruane 22 March 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: