Можно ли сделать выборку по нескольким элементам сразу в коллекцию?

104
18 июня 2019, 10:50

На данный момент у меня есть вот такой код выборки данных:

private SerialPreviewViewModel[] GetSerials(params IHtmlCollection<IElement>[] dataElements)
{
    // Обрабока коллекций циклом
    return new SerialPreviewViewModel[] { };
}
public async Task<IPageModel> LoadPageAsync(Uri pageUrl)
{
    IDocument document = await LoadStreamAsync(pageUrl);
    IElement content = document.QuerySelector("div#dle-content");
    IPaginatorModel paginator = GetPaginator(content.QuerySelector("div.navi"));
    IHtmlCollection<IElement> postContentTitles = content.QuerySelectorAll("div.newstitle");
    IHtmlCollection<IElement> postContentInfo = content.QuerySelectorAll("div.newsinfo");
    IHtmlCollection<IElement> postContentShort = content.QuerySelectorAll("div.news_short");
    PageModel result = new PageModel
    (
        new TaskCommand(async () => await LoadPageAsync(pageUrl)),
        paginator,
        GetSerials(postContentTitles, postContentInfo, postContentShort)
    );
    return await Task.FromResult(result);
}
private static IPaginatorModel GetPaginator(IParentNode element)
{
    IHtmlCollection<IElement> paginatorData = element.QuerySelectorAll(".navigation > *");
    int[] paginatorPagesList = new int[paginatorData.Length];
    for (int i = 0; i < paginatorData.Length; i++)
    {
        IElement currentElement = paginatorData[i];
        paginatorPagesList[i] = currentElement.TagName == "A"
            ? int.Parse(paginatorData[i].Text())
            : currentElement.TagName == "SPAN" && currentElement.ClassName == "nav_ext"
                ? 0
                : -int.Parse(paginatorData[i].Text());
    }
    return new PaginatorModel(Math.Abs(paginatorPagesList.First(i => Math.Abs(i) > 0)),
        paginatorPagesList.Select(Math.Abs).ToArray());
}

Факт того что приходится делать выборку по 3м классам сразу в том, что тот кто писал HTML для сайта который необходимо парсить, забыл или не захотел сделать объединение постов в один элемент, поэтому приходится извращением выбирать по 3 элемента и извлекать из каждого данные.

Можно ли сделать такую выборку, например как-то так:

div.newstitle, newsinfo, div.news_short

что бы в конечном результате получить объект коллекции который содержал бы в себе коллекции в которые были бы уложены по 3 запрошенных элемента?

Answer 1

Не знаю, будет ли это является правильным ответом, но что мешает завезти анонимный тип:

  var result = new
            {
                postContentTitles = content.QuerySelectorAll("div.newstitle"),
                ostContentInfo = content.QuerySelectorAll("div.newsinfo"),
                postContentShort = content.QuerySelectorAll("div.news_short")
            };

На выходе получаем анонимный объект, в который упакованы 3 коллекции.

Ну или если вам нужно передавать куда-то это все в метод, то заведите словарь Dictionary<string,IHtmlCollection<IElement>>, а внутри метода по ключу получайте нужную коллекцию.

READ ALSO
DefaultModelBinder в asp.net mvc

DefaultModelBinder в asp.net mvc

Подскажите пожалуйстаКак правильно должна применяться привязка модели в mvc

108
Обратная совместимость в .NET CORE

Обратная совместимость в .NET CORE

Как я понял, многое вырезали изNET CORE в угоду кроссплатформенности

111