我已经研究了数组的各种不同方式,arraylist,dictionaries ......但是由于我已经习惯了PHP,我不能完全确定我能收集以下信息的最佳方式。
我的程序循环遍历每个用户,如果它们是位置ID,我想将其添加到某种集合/数组中。预计不同的用户将拥有相同的位置ID。
如果位置ID相同,我需要增加该位置ID出现次数的整数。
示例:
User1 - Location1
User2 - Location3
User3 - Location3
Location1 = 1
Location3 = 2
我需要以某种方式将每个用户ID附加到此集合。所以Location3 / 2次出现/ user2 / user3
我一直试图找出最好的方法,现在大约两个小时,多维数组,arraylists,dictionaries的所有不同方法都有点令人困惑,因为它对我的PHP知识来说似乎都是抽象的。我认为C#以完全不同的方式处理数组。
本质上,具有唯一位置ID /出现次数/用户集合的集合需要存储在可以作为参数传递到程序中其他位置的内容中。
我制作了一个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数组相同的方式收集相同的信息?
答案 0 :(得分:2)
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);
}
}
有关详细信息,请参阅Enumerable.GroupBy()。
这是Extension Method超过IEnumerable<T>
接口,由任何内置集合(例如数组T[]
,List<T>
,Dictionary<K,V>
等实现。它接受一个lambda expression指向您正在分组的类集合的属性。
答案 1 :(得分:0)
如果要构建循环初始数据的列表,可以创建如下对象:
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
答案 2 :(得分:0)
创建一个对象来保存每个数据项。
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 ++;
}
}
答案 3 :(得分:0)
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);