用于类的面向树的数据结构的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>();
}
}
我现在的理解是,您想要创建删除了除名称指定的参数之外的所有参数的"树"。你应该为此创建一个消息的副本,因为如果不这样做,你将更改原始消息,并且无法恢复"丢失"的参数(我这么说是因为你在评论中说你希望它是临时的)。
因此,有了这个代码应该或多或少是这样的:
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);
}
}
像这样,您可以保持消息的原样,但代码的其余部分只是跳过它们。