Фильтрация данных по одному и тому же идентификатору - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть класс модели

public class Model
  {
    public string name { get; set; }
    public string files { get; set; }
   }

У меня есть класс контроллера, который заполняет данные из базы данных в эту модель

 List<Model> model = new List<Model>();    
 while (reader.Read()){
     var om = new Model();

     if (reader != null)
         {
          om.name = reader.GetString(0);
          om.files = reader.GetString(1);
          model.Add(om)               
   }

Как я могу отфильтровать и объединить все файлы, которые имеютпохожие имена?

Я читал о linq и пробовал это

  var jm = om.name
    .Where(o => om.name.Contains(o))
    .Select() ;

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это может работать для вас:

var grouped = model.GroupBy(m => m.name).ToArray();

Это создаст объект grouped типа IGrouping<string, Model>[] (массив IGrouping...) .ToArray() необязательно, и если вы удалите его, выполучить IEnumerable<IGrouping<string, Model>>, но не позволяйте вложенным <> напугать вас.

Элементы в вашем исходном списке сгруппированы по имени, поэтому у группы будет свойство Key, которое будет таким же длякаждый элемент в группе.

Чтобы напечатать результаты, например:

foreach(var group in grouped)
{
    Console.WriteLine($"Printing group: {group.Key}");
    foreach(var model in group)
    {
        Console.WriteLine($"\tName: {model.name}, File: {model.file}");
    }
}

Обратите внимание, что каждый элемент в группе является коллекцией объектов вашей модели.

Используйте отладчик, чтобы увидеть, как выглядит эта структура, и если вам нужна дополнительная помощь - спросите ...

0 голосов
/ 13 февраля 2019

Измените свою модель

public class Model
{
   public string name { get; set; }
   public IList<string> files { get; set; }
}

Используйте словарь.

var models = new Dictionary<string, Model>();
while (reader.Read())
{
    var om = new Model();

    if (reader != null)
    {
        var name = reader.GetString(0);
        var file = reader.GetString(1);

        if (models.Contains(name))
            models[name].files.Add(file); 
        else
        {
            models.Add(name, new Model
            {
                name = name,
                files = new List<string>{files}
            });
        }
    }
}

Затем вы можете получить комбинированный список с помощью LINQ:

var peopleFileLists = models.Select(x => x.Value).ToList();
foreach(var person in peopleFileLists)
{
   foreach(var file in person.files)
     Console.WriteLine(person.name + "-" + file);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...