根据相同的ID过滤数据

时间:2019-02-13 16:53:48

标签: c# asp.net-mvc linq

我有一个模型课

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docRef = rootRef.collection("yourCollection").document("yourDocument");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> map = document.getData();
                Log.d(TAG, String.valueOf(map.size()));
            }
        }
    }
});

我有一个控制器类,可将数据库中的数据填充到该模型中

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

如何过滤和合并所有具有相似名字的文件?

我了解了linq并尝试过

 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)               
   }

2 个答案:

答案 0 :(得分:1)

这可能对您有用:

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

这将创建类型为groupedIGrouping<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}");
    }
}

请注意,组中的每个元素都是模型对象的集合。

使用调试器查看该结构的外观以及是否需要更多帮助-问...

答案 1 :(得分:0)

更改模型

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);
}