我有一个列表,其中 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/