DENDRINOS K Ответов: 1

Верните больше столбцов таблицы из двух с помощью zip.enumerable


У меня есть следующий код C#, как добавить данные из var aways в третий столбец "Away" ???? С "Возвращение names.Zip ...." Я не могу....

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HtmlAgilityPack;

namespace GetGamerankingsData {
    public partial class Form1 : Form
    {
        DataTable table = new DataTable("GameRankingsDataView");
      

        HtmlWeb web = new HtmlWeb();
        

        public Form1()
            
        {


            InitializeComponent();
            InitTable();
        }
        public class NameAndScore {
    public string Name { get; set; }
    public string Score { get; set; }
      
            
        }

  
        private void InitTable()
        {
            
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("Score", typeof(string));

           table.Columns.Add("Away", typeof(string));
          
  gameRankingsDataView.DataSource = table;
           
        }
        private async Task<List<nameandscore>> GameRankingsFromPage(int pageNum) {
            string url = "https://www.totalcorner.com/team/view/6";
            if (pageNum != 0)
                url = "https://www.totalcorner.com/team/view/6/page:" + pageNum.ToString();
            var doc = await Task.Factory.StartNew(() => web.Load(url));
            var nameNodes = doc.DocumentNode.SelectNodes("//*[@id='inplay_match_table']/tbody[3]/tr/td[1]/div/a");

            var scoreNodes = doc.DocumentNode.SelectNodes("//*[@id='inplay_match_table']/tbody[3]/tr/td[4]/a/span");
            var awayNodes = doc.DocumentNode.SelectNodes("//*[@id='inplay_match_table']/tbody[3]/tr/td[6]/a/span");

            if (nameNodes == null || scoreNodes == null)
                return new List<nameandscore>();

            var names = nameNodes.Select(node => node.InnerText);
            var scores = scoreNodes.Select(node => node.InnerText);
           
            var aways = scoreNodes.Select(node => node.InnerText);
            
            return names.Zip(scores, (name, score) => new NameAndScore() { Name = name, Score = score }).ToList();
        }
        private async void Form1_Load(object sender, EventArgs e) {
            int pageNum = 0;
            var rankings = await GameRankingsFromPage(0);
            while (rankings.Count > 0 && pageNum < 3)
            {
                foreach (var ranking in rankings)
                    
               table.Rows.Add(ranking.Name, ranking.Score);
                
                
                rankings = await GameRankingsFromPage(++pageNum);
            }
        }

    }
}

ZurdoDev

Пожалуйста, разместите только соответствующий код. А так я понятия не имею, о чем вы просите и где застряли.

DENDRINOS K

Спасибо Вам за Ваш ответ, Зурдодев......
Часть моего кода :
вернуться names.Zip(баллы, (название, результат) =&ГТ; новый NameAndScore() { имя = имя, Результат = Результат }).Список();

возвращает только два из трех значений-массивов ToList для таблицы (имена и оценки)...
Я хочу вернуться и третьим (кстати) .....

Sinisa Hajnal

Есть ли причина, по которой Вы не можете изменить NameAndScore с помощью GetGameData (просто изменить имя) и добавить необходимую функциональность?

DENDRINOS K

Спасибо тебе, Синиса !!!
Нет, это не так ... но я ученик с C# и не знаю точно, что делать...

1 Ответов

Рейтинг:
0

Andrew Baylis

Добавьте еще одно поле в NameAndScore, чтобы хранить информацию "прочь".
напр.:

public class NameAndScore {
    public string Name { get; set; }
    public string Score { get; set; }
    public bool Away { get; set; }              
        }

Теперь просто загрузите необходимую информацию в оператор return;
return names.Zip(scores, (name, score, away) => new NameAndScore() { Name = name, Score = score, Away = away }).ToList();


Maciej Los

5ed!

Richard Deeming

Это не сработает. То Zip метод[^] не имеет перегрузки, которая принимает функцию, принимающую три входа.

Вам нужно будет позвонить Zip дважды:

return names
    .Zip(scores, (name, score) => new { name, score })
    .Zip(aways, (z, away) => new NameAndScore { Name = z.name, Score = z.score, Away = away });