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

所以我想基于mySubObj的prop字符串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>();
    }


}

最佳答案

在您要创建“树”并删除所有由名称指定的参数之外的所有参数时,我的理解。您应该为此创建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 } }
                  );


代替“ ...”,您必须从消息中复制其他参数。

综上所述,暂时删除这些属性对于您遇到的任何问题似乎都是不好的解决方案。如果要将此方法传递给另一个方法,是否不能更改此方法以告知它应查看的属性?

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

Edit2:再次修正代码(现在重复的属性会导致其他消息,另请参见我的替代答案。

07-26 04:27