构建唯一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数组相同的方式收集相同的信息吗?
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);