2011-01-20 56 views
0

这些都在C#中,使用.NET 3.5。比较通用列表的特定属性并合并类似数据

我有一个填充了书籍信息的列表。每个项目包含过程缩写,课程数量和课程的部分:

myList1.Add("ACCT", 100, "1"); 
myList1.Add("ACCT", 100, "2"); 
myList1.Add("BUS", 101, "1"); and so on... 

我需要做的是结合具有相同的课程和课程,因此部分是在一个字符串中的项目。

"ACCT", 100, "1, 2" 
"BUS", 101, "1" 

我应该如何比较列表中的每个项目来检查匹配?最初的方法利用了if-else语句的长链并使用了5个列表。我试图避免这种情况。是this question在我的正确轨道上?

编辑:要回答菲利普的问题,列表使用含托马斯·莱维斯克的回答这些属性的类:

class Course 
{ 
    public string Abbreviation { get; set; } 
    public int Number { get; set; } 
    public string Section { get; set; } 
} 

,并通过一种方法从数据访问类填充:

List<Course> list = DataAccess.GetData(); 

希望这清除了这一点。

+0

如何定义myList1 ? – Philipp 2011-01-20 19:15:50

回答

1

假设下面的类声明:如果您使用的是List<Tuple<string, string, string>>

var list = new List<Course> 
{ 
    new Course { Abbreviation = "ACCT", Number = 100, Section = "1" }, 
    new Course { Abbreviation = "ACCT", Number = 100, Section = "2" }, 
    new Course { Abbreviation = "BUS", Number = 101, Section = "1" }, 
    ... 
}; 

var query = from c in list 
      group c by new { c.Abbreviation, c.Number } into g 
      select string.Format("\"{0}\", {1}, \"{2}\"", 
           g.Key.Abbreviation, 
           g.Key.Number, 
           String.Join(", ", g.Select(c => c.Section).ToArray())); 

List<string> result = query.ToList(); 
1

,你可以这样做::

class Course 
{ 
    public string Abbreviation { get; set; } 
    public int Number { get; set; } 
    public string Section { get; set; } 
} 

你可以做这样的事情

var newList = myList1.GroupBy(i => new { i.Item1, i.Item2 }) 
         .Select(g => new Tuple(g.Key.Item1, 
               g.Key.Item2, 
               String.Join(", ", g.Select(i => i.Item3)))); 
+1

3.5中的String.Join需要一个数组,而不是IEnumerable。需要IEnumerable的重载仅在4.0 – 2011-01-20 19:34:20