C#LINQ用于面向树的数据结构类

时间:2012-03-31 16:40:41

标签: c# linq list tree

我有List其中myObj拥有自己的对象列表,名为example mySubObj。 对象mySubObj具有prop字符串Name。

所以我想根据mySubObj中的prop string name创建新的List。

我写了这段代码,但似乎错了:

var por = msgs.Where(x => x.Parameters
                        .Where(p => p.ParameterName == s).Count() == 1);

任何人都可以帮助我使用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 个答案:

答案 0 :(得分:1)

除非您按名称指定的参数除外,否则在您想要创建“树”时我是如何理解的。你应该为此创建一个Message的副本,因为如果不是,你将更改原始的并且无法恢复“丢失”的参数(我说这个,因为你在评论中说你希望它是临时的)。

因此,代码应该或多或少像这样:

        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 } }
                  );

而不是“...”,你必须从消息中复制其他参数。

所有这些都说,暂时删除这些属性似乎是解决你遇到的任何问题的一个糟糕的解决方案。如果你想将它传递给另一个方法,你不能改变这个方法来告诉它应该看的属性吗?

编辑:固定代码(第二次)

编辑2:再次修复了代码(现在重复的属性会产生其他消息,另请参阅我的替代答案。

答案 1 :(得分:1)

我相信这就是你想要的。我知道这可以清理成一个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);

答案 2 :(得分:0)

我正在写第二个答案,因为现在OP增加了一些代码,可能会或可能不会有另一个问题的解决方案。

您真的需要从消息中删除参数吗?为什么不改变这样的代码:

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

就像这样,你可以保留你的消息,但其余代码只是跳过它们。