Заполнение Списка <T> в цикле foreach после сопоставления с образцом

Я довольно плохо знаком с программированием C# и нуждаюсь в некоторой помощи.

Я пытаюсь присвоить значения, которые я собрал от канала JSON до моего собственного типа, класса, в котором я определил определенные поля (свойства) для помещения элементов JSON в плюс элементы, которые получены из процесса сопоставления с образцом RegEx. Это затем позволит мне получать доступ к объекту с помощью LINQ, поскольку я использую Список для содержания моих объектов.

Существует цикл foreach в моем коде, что циклы для каждого соответствия, которое находит мой метод RegEx. Я только интересуюсь частями канала JSON, где существует соответствие.

Таким образом, мой собственный определенный класс как таков:

//simple field definition class
public class TwitterCollection
{
    public string origURL { get; set; }
    public string txtDesc { get; set; }
    public string imgURL { get; set; }
    public string userName { get; set; }
    public string createdAt { get; set; }
}

И затем я хочу заполнить Список в цикле Соответствий RegEx:

    foreach (Match match in matches)
    {

        GroupCollection groups = match.Groups;
        var tc = new List<TwitterCollection>()
        {
            origURL = groups[0].Value.ToString(),
            txtDesc = res.text,
            imgUrl = res.profile_image_url,
            userName = res.from_user_id,
            createdAt = res.created_at,

        };
    }

Код затем продолжит извлекать и сортировать результаты через Linq к Объектам. Но компилятор на самом деле не позволит мне создать мой var tc = new List<TwitterCollection>() потому что: 'Система. Наборы. Универсальный. Список' не содержит определение для 'origURL'... даже при том, что я определил его.

Это не отмечает ошибку, если я просто пишу new TwitterCollection но затем как я обращаюсь к этому в своем выражении Linq позже??

Помогите!

5
задан Alex 15 January 2010 в 18:13
поделиться

3 ответа

Вам нужно создать список за пределами цикла:

var list = new List<TwitterCollection>();
foreach (Match match in matches)
{

    GroupCollection groups = match.Groups;
    var tc = new TwitterCollection
    {
        origURL = groups[0].Value.ToString(),
        txtDesc = res.text,
        imgUrl = res.profile_image_url,
        userName = res.from_user_id,
        createdAt = res.created_at,
    };
    list.Add(tc);
}

На данный момент вы пытаетесь создать новый список для каждого элемента. Фактическая ошибка компиляции состоит в том, что ваш инициализатор объекта предназначен для объекта TwitterCollection объекта, а не в списке их, но в любом случае нет смысла фиксирования этого недостатка в логике.

10
ответ дан 18 December 2019 в 11:56
поделиться

Проблема в том, что вы Пытаются использовать инициализатор объекта для для объекта TwitterCollection , но вы применяете его к списку . То, что вы хотите сделать вместо этого, предварительно создать список и вызов добавить вместо того, чтобы воссоздать его каждый раз.

var list = new List<TwitterCollection>();
foreach (Match match in matches)
{

    GroupCollection groups = match.Groups;
    var tc = new TwitterCollection()
    {
        origURL = groups[0].Value.ToString(),
        txtDesc = res.text,
        imgUrl = res.profile_image_url,
        userName = res.from_user_id,
        createdAt = res.created_at,

    };
    list.Add(tc);
}

Или если вы хотите просто запрос LINQ

var list = matches
  .Cast<Match>()
  .Select(x => new TwitterCollection() {
            origURL = x.Groups[0].Value.ToString(),
            txtDesc = res.text,
            imgUrl = res.profile_image_url,
            userName = res.from_user_id,
            createdAt = res.created_at } )
  .ToList();
3
ответ дан 18 December 2019 в 11:56
поделиться

Я думаю, что вам следует попробовать Intellij Idea, это самая мощная интуитивно понятная Java IDE, которую я никогда не видел ( http://www.jetbrains.com/idea/index.html ). Новая версия Community Edition бесплатна и более чем достаточна для разработки Java. Поскольку это очень конфигурируемый вариант, вы можете выбрать «TAB» для автоматического завершения, но я думаю, что вы можете извлечь уроки из существующих комбинаций, которые хорошо разработаны.

С уважением.

-121--4667866-

Связанные с @ Goz и @ Josh _ Kelley, вы можете получить gcc/g + +, чтобы выплюнуть предварительно обработанный источник (с # includes inline) с помощью -E. Это один из способов определить, насколько велик ваш источник.

И если проблема заключается в самом компиляторе, вы можете сохранить команду compile, которая занимает много времени, чтобы увидеть, есть ли определенный доступ к файлу или конкретное внутреннее действие, которое занимает много времени.

-121--2319041-

Вне темы, но так как вы упомянули, что вы новичок в C #, я подумал, что вам следует рассмотреть вопрос о соблюдении правил именования Microsoft:

http://msdn.microsoft.com/en-us/library/fzcth91k%28VS.71%29.aspx

Ваше объявление класса станет:

public class TwitterCollection
{
    public string OrignalUrl { get; set; }
    public string TextDescription { get; set; }
    public string ImageUrl { get; set; }
    public string UserName { get; set; }
    public string CreatedAt { get; set; }
}

Еще одна вещь, не обозначенная в приведенной ссылке, это в большинстве случаев венгерская нотация (txtDesc, например) Также не следует использовать аббревиатуры, если только не принята номенклатура (например, Url), так как обычно нет затрат, связанных с использованием полного слова, а не аббревиатуры.

Надеюсь, это полезно!

2
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

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