Заполнение списка <T>внутри цикла foreach после сопоставления с образцом - PullRequest
4 голосов
/ 15 января 2010

Я довольно новичок в программировании на C # и мне нужна помощь.

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

В моем коде есть цикл 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 to Objects. Но на самом деле компилятор не позволит мне создать var tc = new List<TwitterCollection>(), потому что: 'System.Collections.Generic.List' не содержит определения для origURL ... даже если я его определил.

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

Пожалуйста, помогите!

Ответы [ 3 ]

8 голосов
/ 15 января 2010

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

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, а не для их списка, но нет смысла исправлять это с помощью этого недостатка в логике.

3 голосов
/ 15 января 2010

Проблема в том, что вы пытаетесь использовать инициализатор объекта для объекта TwitterCollection, но применяете его к List<TwitterCollection>. Вместо этого вы должны предварительно создать список и вызвать Add вместо того, чтобы создавать его заново каждый раз.

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();
2 голосов
/ 15 января 2010

Не по теме, но, так как вы упомянули, что вы новичок в 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), поскольку обычно использование полного слова, а не аббревиатуры не требует никаких затрат.

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

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