构建唯一ID';集合的最佳方式;s以及他们的计数

本文关键字:他们的 方式 ID 唯一 构建 集合 最佳 | 更新日期: 2023-09-27 17:58:31

我研究了数组、数组列表、字典的各种不同方法。。。但由于我已经习惯了PHP,我不完全确定收集以下信息的最佳方式。

我的程序循环遍历每个用户,如果他们是位置ID,我想将其添加到某种集合/数组中。预计不同的用户将拥有相同的位置ID。

如果位置ID相同,我需要增加该位置ID出现次数的整数。

示例:

User1 - Location1
User2 - Location3
User3 - Location3
Location1 = 1
Location3 = 2

此外我需要以某种方式将每个用户ID附加到此集合中。因此位置3/2次/user2/user3

大约两个小时以来,我一直在试图找出最好的方法,而多维数组、数组列表、字典的所有不同方法都有点令人困惑,因为在我的PHP知识中,这一切似乎都很抽象。我认为C#处理数组的方式完全不同。

从本质上讲,具有唯一位置ID的集合/ecurrences/和users集合需要存储在某个可以作为参数传递到程序中其他地方的东西中。

我制作了一个PHP脚本,它正是我想要的

foreach($call["data"] as $v)
{
    // Foreach USER ($v containing their unique ID and location ID.)
    $user_id        = $v["id"];
    $location_id    = $v["location"]["id"];
    // This adds the location ID as the key within the array, followed by every user who has it. I don't need a count in this case, as I could just count the number of users.
    $collection[$location_id][$user_id] = null;
}

当使用print_r 打印时,这反过来会创建此数组

[106078429431815] => Array
(
    [620790873] => 
    [626276302] => 
    [100000152470577] => 
)

(输出的一小部分)。-添加了PHP示例。有人知道我如何让C#以与我的PHP数组相同的方式收集相同的信息吗?

构建唯一ID';集合的最佳方式;s以及他们的计数

using System.Linq;
var grouppingByLocation = users.GroupBy(u => u.LocationID);
foreach (var g in grouppingByLocation)
{
     Console.WriteLine("Location id: {0}", g.Key);
     foreach (var u in g)
     {
          Console.WriteLine("User id: {0}", u.ID);
     }
}

请参见可枚举。GroupBy()获取更多详细信息。

这是由任何内置集合(如Array T[]List<T>Dictionary<K,V>等)实现的IEnumerable<T>接口上的扩展方法,该集合接受指向要分组的类集合的属性的lambda表达式。

如果你想构建通过初始数据循环的列表,你可以创建这样的对象:

var list = new Dictionary<int, Tuple<int, List<int>>();

并将其填充到循环中

if(list[locationID]==null) list[locationID] = Tuple.Create(0,new List<int>());
//..
list[locationId].Item1++;  // counter    
list[locationId].Item2.Add(userId); //list of users

创建一个对象来保存每个数据项。

public Class Model{
        public int LocationId {get;set;}
        public int Occurences{get;set;}
        public IList<User> Users{get;set;}
    }

将容器初始化为项目列表。

var container = List<Model>();

处理用户列表。

foreach(var user in userList){
    var model = container.SingleOrDefault(x=> x.LocationId == user.LocationId);
    if(model != null){
       model.Users.Add(user);
    } else{
      model = new Model{
      model.Users = new List<User>.Add(user);
      model.LocationId = user.LocationId;
      container.Add(model)
    }
    model.Occruences ++;
}

}

var byLocation = users.Where(u => !string.IsNullOrEmpty(u.Location))
    .GroupBy(u => u.Location);
var stats = byLocation.Select(l => string.Format("{0} / {1} occurrences / {2}",
    l.Key, l.Count(), string.Join("/", l.Select(u => u.User)));
// And just to print the result
foreach (var location in stats)
    Console.WriteLine(location);