C# Проверьте, имеет ли столбец значение и сложите все как записи - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь суммировать все одинаковые значения, но мне может показаться, что я только суммирую все значения в сетке данных.

Ожидаемый выход таблицы:

Team   | MinSecondsPerGame | TeamMins
team 1 |   20              | 50
team 2 |   35              | 45
team 3 |   35              | 40
team 1 |   30              | 50
team 2 |   10              | 45
team 3 |   5               | 40

Текущий код:

public void TeamPoints()
{
    decimal total = dataGridView1.Rows.Cast<DataGridViewRow>()
        .Where(r => r.Cells["Team"].Value == r.Cells["Team"].Value)
        .Sum(t => Convert.ToInt32(t.Cells["MinSecondsPerGame"].Value));

    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (dataGridView1.Rows[i].Cells["Team"].Value == dataGridView1.Rows[i].Cells["Team"].Value)
            dataGridView1.Rows[i].Cells["TeamMins"].Value = total;
    }
}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы можете использовать Enumerable.GroupBy для группировки по имени группы, а затем рассчитать сумму MinSecondsPerGame. Например, перед привязкой к DataGridView можно применить следующий Linq к исходной коллекции.

 var result = originalCollection.GroupBy(x=>x.Team)
                                .SelectMany(x=>x.Select(c=>new 
                                                       {
                                                        c.Team,
                                                        c.MinSecondsPerGame,
                                                        TeamMins=x.Sum(v=>v.MinSecondsPerGame
                                                       )})).ToList();

Результат может быть привязан к вашему DataGridView.

Если вы хотите получить информацию из GridView и затем добавьте столбец, вы можете сделать следующее.

var dataCollection = dataGridView1.Rows
                                  .Cast<DataGridViewRow>()
                                  .Select(r =>
                                     new 
                                     {
                                       Team = r.Cells["Team"].Value,
                                       MinSecondsPerGame = Convert.ToInt32(r.Cells["MinSecondsPerGame"].Value),
                                     }
                                     )
                                     .GroupBy(x => x.Team)
                                     .SelectMany(x => 
                                                x.Select(c => 
                                                new 
                                                { 
                                                  c.Team, 
                                                  c.MinSecondsPerGame, 
                                                  TeamMins = x.Sum(v => v.MinSecondsPerGame) 
                                                })); 
dataGridView1.DataSource = dataCollection.ToList();
1 голос
/ 21 января 2020

Основы c logi c:

Вы можете использовать LINQ select +, где + sum, чтобы сделать это.
И точка - это значение TeamMins, использующее где фильтровать same Team данные и затем summary их, как показано ниже:

    var list = new List<dynamic>(){
        new {Team="team 1",MinSecondsPerGame=20},
        new {Team="team 1",MinSecondsPerGame=30},
        new {Team="team 2",MinSecondsPerGame=35},
        new {Team="team 2",MinSecondsPerGame=10},
        new {Team="team 3",MinSecondsPerGame=35},
        new {Team="team 3",MinSecondsPerGame=5},
    };

    var result = list.Select(s => 
        new {
            s.Team,
            s.MinSecondsPerGame,
            TeamMins=list.Where(_=>_.Team==s.Team).Sum(_=>_.MinSecondsPerGame)
        }
    );
    Console.WriteLine(result);

Ответ по вашему делу

public void TeamPoints()
{
    var list = dataGridView1.Rows.Cast<DataGridViewRow>().Select(r => 
        new {
            Team = r.Cells["Team"].Value,
            MinSecondsPerGame = Convert.ToInt32(r.Cells["MinSecondsPerGame"].Value),
        }
    );
    var result = list.Select(s =>
         new {
             s.Team,
             s.MinSecondsPerGame,
             TeamMins = list.Where(_ => _.Team == s.Team).Sum(_ => _.MinSecondsPerGame)
         }
    ).ToList();
    dataGridView1.DataSource = result;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...