2012-03-31 32 views
2

我有列表,其中myObj擁有自己的名爲mySubObj的對象列表。 對象mySubObj具有prop字符串名稱。C#LINQ用於面向樹的數據結構類

所以我想在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>(); 
    } 


} 
+0

是否想讓所有具有名稱x的參數的消息? – aKzenT 2012-03-31 16:44:16

+4

這是怎麼回事?你想做什麼?你有什麼與你除了什麼? – 2012-03-31 16:47:51

+0

嗯。我發現問題,但沒有解決方案,問題是myObj有兩個ParameterNames,並且這個LINQ做它要做的事情。除了我想要的輸出帶myObj女巫只有mySubObj一個定義ParameterName,另一種方式說我想角色出所有subObj名稱不同於字符串s。我會編輯問題。 – JohnDoeKazama 2012-03-31 17:16:30

回答

1

如何我明白,在你想創建「樹」的時候,除了你指定的名稱之外,所有參數都會被刪除。你應該爲此創建一個消息副本,因爲如果沒有,你會改變原來的,並且不能恢復「丟失」參數(我這樣說,因爲你在評論中說你希望它是暫時的)。

所以用這個代碼應該或多或少是這樣的:

 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:固定碼再次(現在的重複屬性導致額外的消息,也看到我的備選答案

+0

這幾乎是相同的東西,除了你正在運行一個不同的計數信息,而OP有一個明確的計數參數。也許這是錯的,但這絕對是一個假設,因爲OP不會給OP做什麼試圖做什麼 – 2012-03-31 17:03:40

+0

對不起沒有...仍然我有所有的消息! – JohnDoeKazama 2012-03-31 17:05:53

+0

對不起,LINQ中顯然不存在這個問題,它在L3Message obj中......其中一些obj包含ParameterNames和LINQ兩種接口,並展開我的頭文件。 – JohnDoeKazama 2012-03-31 17:23:22

1

我認爲,這是什麼。你想要的。我知道這大概可以洗淨後放入一個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); 
+0

對不起......輸出很混亂。我現在很迷茫我的代碼...明天我會繼續這樣做(我已經筋疲力盡),夥計們感謝您的幫助...希望明天您能夠上網:-) – JohnDoeKazama 2012-03-31 17:57:58

0

我m寫了第二個答案,因爲現在OP增加了更多的代碼,可能有也可能不是解決問題的另一種方法。

您是否確實需要從消息中刪除參數?爲什麼不改變你的代碼是這樣的:

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

這樣你保持你的消息像他們不過是代碼的其餘部分只是跳過他們。

+0

我會測試這段代碼並給出反饋。 – JohnDoeKazama 2012-04-01 12:42:21

+0

你的第一個答案工作!在那裏看到我的評論。 – JohnDoeKazama 2012-04-01 13:02:58