Сравнение определенных свойств общего списка и объединение похожих данных - PullRequest
0 голосов
/ 20 января 2011

Это все в 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 списков.Я пытаюсь избежать этого.Является ли этот вопрос на правильном пути для меня?

РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос Филиппа, список использует класс, содержащий такие свойства, как ответ Томаса Левеска:

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

И заполняется методом из класса DataAccess:

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

Надеюсь, что это прояснится.

Ответы [ 2 ]

1 голос
/ 20 января 2011

если вы используете List<Tuple<string, string, string>>, вы можете сделать:

    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 голос
/ 20 января 2011

Предполагая следующее объявление класса:

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

Вы можете сделать что-то подобное:

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();
...