2014-09-06 60 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