C # LINQ для древовидной структуры данных классов - PullRequest
2 голосов
/ 31 марта 2012

У меня есть список, в котором myObj имеет собственный список объектов, который называется example mySubObj.Объект mySubObj имеет опору строки Имени

1002 * Так что я хочу, чтобы создать новый список базу на опорах струнного Названия от mySubObj 1004 * Я написал этот код, но мне кажется, что это не так:.. 1006 *

Может ли кто-нибудь помочь мне с LINQ?

РЕДАКТИРОВАТЬ: Это целый код:

 foreach (string s in parameters)
            {
                using (StreamWriter streamWriter = new StreamWriter(outputFolder + "/" + s + ".xls"))
                {
                    streamWriter.Write("No.\tMessage\tMS\tTime\tSC");

                    var por = (from m in msgs
                               from p in m.Parameters
                               where p.ParameterName == s
                               select m).Distinct();


                    List<string> headeri = new List<string>();
                    List<string> vrijednosti = new List<string>();

                    foreach (L3Message p in por)
                    {
                        foreach (Parameter pam in p.Parameters)
                        {
                            TraverseForHeaders(pam, ref headeri);
                        }
                    }

                    foreach (string head in headeri)
                    {
                        streamWriter.Write("\t" + head);
                    }
                    streamWriter.Write("\n");

Редактировать 2:

Здесьэто два из моих классов, с этим он должен быть более определенным:

public class L3Message
{
    public int Number { get; set; }
    public string MessageName { get; set; }
    public string Device { get; set; }
    public string Time { get; set; }
    public string ScramblingCode { get; set; }

    public List<Parameter> Parameters { get; set; }

    public L3Message()
    {
        Parameters = new List<Parameter>();
    }}

public class Parameter
{
    public int numOfWhitespaces { get; set; }

    public string ParameterName { get; set; }
    public string ParameterValue { get; set; }

    public Parameter Parent { get; set; }
    public List<Parameter> SubParameters { get; set; }

    public Parameter()
    {
        SubParameters = new List<Parameter>();
    }


}

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Я считаю, что это то, что вы хотите.Я знаю, что это, вероятно, можно объединить в один оператор LINQ, но можете ли вы проверить, действительно ли это то, что вам нужно в первую очередь?

var hasS = msgs.Where(x=>x.Parameters.Where(p=>p.ParameterName == s).Count() > 0);
var hasOtherThanS = msgs.Where(x=>x.Parameters.Where(p=>p.ParameterName != s).Count() > 0);
var por = hasS.Except(hasOtherThanS);
1 голос
/ 31 марта 2012

Насколько я понимаю, на данный момент вы хотите создать «дерево» со всеми удаленными параметрами, кроме того, который вы указали по имени. Для этого вам следует создать копию Сообщения, поскольку в противном случае вы измените оригинал и не сможете восстановить «потерянные» параметры (я говорю это, потому что вы сказали в комментариях, что хотите, чтобы оно было временным).

Итак, код должен быть примерно таким:

        var por = (from m in messages
                   from p in m.Parameters
                   where p.ParameterName == s
                   select new L3Message { Number = m.Number, ...,  Parameters = new List<Parameter> { p } }
                  );

Вместо "..." вы должны скопировать другие параметры из сообщения.

Все это говорит о том, что временное удаление этих свойств кажется плохим решением любой проблемы, с которой вы столкнулись. Если вы хотите передать это другому методу, не можете ли вы изменить этот метод, указав ему свойство, на которое он должен смотреть?

Редактировать: Фиксированный код (второй раз)

Edit2: Снова исправлен код (теперь повторяющиеся свойства приводят к дополнительным сообщениям, см. Также мой альтернативный ответ.

0 голосов
/ 01 апреля 2012

Я пишу второй ответ, потому что теперь, когда ОП добавил еще немного кода, может быть, а может и не быть другое решение проблемы.

Вам действительно нужно удалить параметры из Сообщений?Почему бы не изменить свой код следующим образом:

foreach (L3Message p in msgs)   
{   
    foreach (Parameter pam in p.Parameters.Where(p => p.ParameterName == s)   
    {   
        TraverseForHeaders(pam, ref headeri);   
    }   
}  

Таким образом вы сохраняете свои сообщения такими, как они есть, но остальная часть кода просто пропускает их.

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