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

本文关键字:数据结构 C#LINQ 用于 | 更新日期: 2023-09-27 18:29:47

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

所以我想从mySubObj创建一个基于道具字符串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:

这是我的两个类,有了它应该更具体:

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

}

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

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

因此,有了这个代码应该或多或少是这样的:

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

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

我正在编写第二个答案,因为现在OP添加了更多的代码,可能有也可能没有其他解决方案。

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

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

像这样,您可以保持消息的原样,但代码的其余部分只是跳过它们。