2

配列、配列リスト、辞書のさまざまな方法を調べました...しかし、PHPに慣れているため、次の情報を収集できる最善の方法について完全にはわかりません。

私のプログラムは各ユーザーをループし、それらが場所 ID である場合、それをある種のコレクション/配列に追加したいと考えています。異なるユーザーが同じロケーション ID を持つことが予想されます。

ロケーション ID が同じ場合、そのロケーション ID の出現回数の整数を増やす必要があります。

例:

User1 - Location1
User2 - Location3
User3 - Location3

Location1 = 1
Location3 = 2

また、このコレクションに各ユーザー ID を追加する必要があります。したがって Location3 / 2 回 / user2/user3

私は約 2 時間、これを行う最善の方法を見つけようとしてきましたが、多次元配列、配列リスト、辞書のさまざまな方法はすべて、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 の例を追加しました。PHP 配列と同じ方法で C# に同じ情報を収集させる方法を知っている人はいますか?

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 、、など) によって実装されるインターフェイス上の拡張メソッドであり、グループ化するクラス コレクションのプロパティを指すラムダ式を受け入れます。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 に答える