2

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

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

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

例子:

User1 - Location1
User2 - Location3
User3 - Location3

Location1 = 1
Location3 = 2

我还需要以某种方式将每个用户 ID 附加到这个集合中。所以 Location3 / 2 次出现 / user2/user3

大约两个小时以来,我一直在试图找出最好的方法,多维数组、数组列表、字典的所有不同方法都有点令人困惑,因为这对我的 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 数组相同的方式收集相同的信息?

4

4 回答 4

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() 。

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

于 2013-02-10T23:49:02.870 回答
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
于 2013-02-10T23:53:05.973 回答
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 ++;
}

}

于 2013-02-10T23:55:55.280 回答
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);
于 2013-02-10T23:56:15.127 回答