2014-09-06 27 views
0

我有關於格式化字符串列表的問題。我正在循環兩個字符串的字典:值和標記名。按條件排列的字符串格式/組列表

myList.Add(myDict.Keys.ElementAt(n) + ":" + myDict.Values.ElementAt(n).Value); 

當迭代完成,我需要按以下方式格式化字符串:該tempstring的

for (int tmp = 0; tmp < myList.Count; tmp++) 
{ 
    if (tmp < myList.Count - 1) 
    { 
     tempString += String.Format(myList[tmp].ToString() + " ,"); 
    } 
} 

輸出將是這樣的:標籤名:值,標籤名:值,標籤名:價值。 但是這裏有一個棘手的部分(對我來說):幾個標籤名稱是相同的,對於程序用途,這些具有相同標籤名稱的項目需要按照該標籤名稱進行分組,如下所示: TagName:value,TagName :價值,價值,價值 你有什麼建議嗎?

更新(讀取XML):

var evt = (from el in doc.Descendants("test") 
     where el.Parent.Name == "Event_1" 
     group el by el.Parent.Element("NameOfEvent").Value into g 
     select new { 
      Name = g.Key, 
      Tests = g.Select(x => new { 
       Value = x.Element("value").Value, 
       TagName = x.Element("tagName").Value 
      }) 
     }).FirstOrDefault(); 

    Console.WriteLine("Event name: " + evt.Name); 
    foreach (var test in evt.Tests) 
    { 

    } 
+1

如何將'TagName'與您的字典鍵一樣使用? – Jonesopolis 2014-09-06 21:55:35

+1

目前還不清楚,你可以展示一個小樣本字典,以及如何提取列表?你需要這個清單嗎?爲什麼你多次將相同的密鑰添加到列表中? – 2014-09-06 21:55:48

+0

字典的關鍵是獨一無二的。那麼你怎麼能重複標籤名稱作爲標籤名稱是字典的關鍵? – CharlesNRice 2014-09-06 21:55:52

回答

1

它看起來像你需要LINQ的Group ByString.Join的組合。

Group By需要一個對象列表併產生一個列表對象列表,其中每個列表對象都包含共同的東西。

{"Key1", "Value1"}, 
{"Key2", "Value2"}, 
{"Key1", "Value3"} 

變爲

{ 
    {"Key1", "Value1"}, 
    {"Key1", "Value3"} 
}, 
{ 
    {"Key2", "Value2"}, 
} 

當組全部由它們的值的值。然後,您可以採用該結果並使用String.Join以逗號分隔的列表形式加入值。

你想要做的是構建一個列表,其中包含所有在同一個鍵下分組在一起的值,然後將它們連接到一個字符串中。

有3個步驟來執行此:

    由標籤
  1. 組值構造一個串對於每個每個標記的值的
  2. 從每個其他構造串的構建最終的字符串

這將是這個樣子:

// Your keys and values 
List<KeyValuePair<string, string>> dict = new List<KeyValuePair<string, string>> 
{ 
    new KeyValuePair<string, string>("TagName1", "value1"), 
    new KeyValuePair<string, string>("TagName2", "value2"), 
    new KeyValuePair<string, string>("TagName1", "value3") 
}; 

// 1. Group all of the values together based on the key 
IEnumerable<IGrouping<string, KeyValuePair<string, string>>> groupedValues = 
      dict.GroupBy(v => v.Key); 

// 2. Construct a string for each of the groups 
IEnumerable<string> builtValues = groupedValues.Select(group => 
{ 
    // returns "TagName1:value1, value2" etc. 
    return group.Key + ":" + string.Join(", ", group.Select(g => g.Value)); 
}); 

// 3. Construct the final string from each of the constructed strings 
string finalResult = string.Join(", ", builtValues); 

然後finalResult將包含TagName1:value1, value3, TagName:value2,這似乎是相對你想要的。

+0

非常感謝很好的解釋。這是非常好的解釋,我將在未來考慮這種方法,但對於這個特定的任務,我無法做到這一點。我不能在早期階段將這些標籤名稱分組,因爲這會影響解決方案中正在進行的其他邏輯。我只能使用該列表添加值。 – user3463933 2014-09-07 08:06:47

+0

@ user3463933也許你應該再看看它,因爲[Group By](http://msdn.microsoft.com/en-us/library/vstudio/bb534501(v = vs.100).aspx)正是你想要的,你想按他們的名字來分組標籤值。如果你需要在列表中列出所有的東西,只需要列出一個類似於我在示例中使用的列表。另外,[分組依據](http://msdn.microsoft.com/en-us/library/vstudio/bb534501(v = vs.100).aspx)不會影響您的邏輯,因爲它不會更改基礎數據結構體。你只是在改變它如何呈現,就是這樣。 – AtinSkrita 2014-09-08 11:43:23

+0

再次感謝您的貢獻,但我仍然非常確定我無法做到這一點。我必須擁有字典,而且,當我遍歷我的排列時,我將添加到列表中所有更改的值。而且,最後一步是按照我的解釋製作輸出。這個順序在整個過程中非常重要,所以如果我在開始時將這些值分組,我會失去整個意義。 – user3463933 2014-09-08 18:54:26