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

标签 c# linq list tree

我有一个列表,其中 myObj 有自己的对象列表,称为示例 mySubObj。 对象 mySubObj 具有属性字符串名称。

所以我想根据 mySubObj 中的 prop string Name 创建新的列表。

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

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:

这是我的两个类(class),应该更具体地说明:

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


}

最佳答案

目前我是如何理解您想要创建“树”并删除除您通过名称指定的参数之外的所有参数的。您应该为此创建消息的副本,因为如果不这样做,您将更改原始消息并且无法恢复“丢失”的参数(我这么说是因为您在评论中说您希望它是临时的)。

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

        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:再次修复代码(现在重复的属性会导致额外的消息,另请参阅我的替代答案。

关于C# LINQ 用于类的面向树的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957746/

相关文章:

c# - 在 Web 项目的每个页面中识别标签和按钮控件

c# - Linq to SQL - 连接和 Skip+Take

c# - 如何使用 linq 树表达式创建具有动态列的数据透视表

c# - 在 LINQ 中有条件地加入

c# - IQueryable、List、IEnumerator 之间的区别?

c# - 通过过滤将列表<>添加到另一个列表<>

c# - Asp.Net Mvc Web 应用程序 PowerBI 登录 HRESULT E_FAIL 错误

c# - 异步/等待中的多个查询(错误 : IEnumerable does not contain ToListAsync())

Python列表对象没有属性报错

list - Scala 列表带偏移量