C # лямбда-упрощение - PullRequest
       2

C # лямбда-упрощение

0 голосов
/ 10 февраля 2012

У меня есть класс игрока, и у игрока есть список выстрелов.Каждый выстрел имеет свои yPos (позицию), потому что yPos игрока может измениться, но выстрел сохранит свою позицию:

class Player
{
    public string Id { set; get; }
    public int yPos { set; get; }
    public List<Shot> shots;

    public Player(string _Id, int _yPos)
    {
        Id = _Id;
        yPos = _yPos;
    }

}
class Shot
{
    public int yPos { set; get; }
    public Shot(int _yPos)
    {
        yPos = _yPos;
    }
}

Тогда в какой-то момент в игре есть идентификатор, и мне нужно найти игрока.и добавьте в список его ударов новый выстрел с позицией игроков.Вот что я закончил:

string tempID = "xxx"; // not important where this temp id is coming from
players.Find(p => p.Id == tempID).shots.Add(new Shot(players.Find(p => p.Id == tempID).yPos));

И, кажется, все в порядке, но выглядит уж странно.Есть ли способ упростить это утверждение, чтобы мне не приходилось искать одного и того же игрока дважды в одном утверждении?

Ответы [ 4 ]

7 голосов
/ 10 февраля 2012

Я бы как минимум кешировал результат вашего игрока:

var player = players.Find(p => p.Id == tempId);
player.shots.Add(new Shot(player.yPos));
4 голосов
/ 10 февраля 2012

Вместо того, чтобы добраться до Игрока, чтобы вытащить его значение yPos и ​​создать с ним новый Выстрел, а затем засунуть этот Выстрел в коллекцию Выстрелов Игрока (как груб!немного больше умов:

class Player
{
    public string Id { set; get; }
    public int yPos { set; get; }
    public List<Shot> shots;

    public Player(string _Id, int _yPos)
    {
        Id = _Id;
        yPos = _yPos;
    }

    public void AddShotToYPos()
    {
        shots.Add(new Shot(yPos));
    }
}

Тогда вы можете сказать:

players.Find(p => p.Id == tempID).AddShotToYPos();
1 голос
/ 10 февраля 2012

С риском того, что, возможно, будет что-то очевидное, это сделает на один поиск меньше и, возможно, будет более читабельным:

0 голосов
/ 10 февраля 2012

ПОЦЕЛУЙ:

var p = players.Find(p => p.Id == tempID);
p.shots.Add(new Shot(p.yPos));

Бессмысленно длинный LINQ:

(from p in players
         where p.Id == tempID
         select p).Take(1).ToList().ForEach(p => p.shots.Add(new Shot(p.yPos)));

Хорошее и короткое расширение:

players.Find(p => p.Id == tempID).Shoot();
...
static class Extensions
{
    public static void Shoot(this Player p)
    {
        p.shots.Add(new Shot(p.yPos));
    }
}

Cooler Lambda

(from p in players
         where p.Id == tempID
         let x = new Func<bool>(() => { p.shots.Add(new Shot(p.yPos)); return true; })
         select x()).First();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...