0
class user    
{
    public string userID { get; set; }
    public string groupID { get; set; }
    public int individualCredit { get; set; }
    public int groupCredit { get; set; }
}

このようなリストがあります

 List<user> listUsers = new List<user>();

私は次のことをする必要があり、これまでに試したことを与えています。

ユーザーを同じグループにまとめたいgroupID

groupCreditグループ内の各メンバーの s を加算し、individualcreditそれをグループ メンバーの数で割って計算します。

最後に、各ユーザーにgroupCredit. 3~5名のグループもあります。

誰でもこれで私を助けることができますか?少なくとも、解決済みの質問のサンプルを教えてください。調べてみましたが、これに相当するものは見つかりませんでした。

これはこれまでの私のlinqです

var groups = lstUsers.GroupBy(x => x.groupID).Select(g => new {ID=g.Key,count=g.Count() });

ここで私が理解していないのは、グループ マークを取得し (すべてのグループ メンバーのマークを追加して、それをグループ メンバーの数で割って計算されます)、グループ内の各メンバーにグループ マークを割り当てることです。

4

3 に答える 3

1
var groups = listUsers.GroupBy(x => x.groupID)
                .Select(g => new { ID = g.Key, AverageCredit = g.Average(u => u.individualCredit) });

foreach (var user in listUsers)
    user.groupCredit = groups.First(u => u.ID == user.groupID).AverageCredit;
于 2014-05-23T22:50:25.323 に答える
0

1 つの LINQ 式ですべてのクエリを実行し、すべてをループで設定します。

var credits = lstUsers.GroupBy(x => x.groupID)
        .Select(g => {ID = g.Key, Credit = g.Sum(x => x.individualCredit)/g.Count()});

foreach (var user in lstUsers)
{
    user.groupCredit = credits.Single(x => x.ID == user.groupID).Credit;
}
于 2014-05-23T22:48:35.643 に答える
0

クラスは参照渡しであるため、それを匿名型に追加するだけです。その後、キーで再検索する必要はありません

var listUsers = new List<user>();
var groups = listUsers.GroupBy(x => x.groupID).Select(g => new { users = g, groupCredit = g.Average(u => u.individualCredit) });
foreach (var group in groups)
{
    foreach (var member in group.users)
    {
        // Avg is a decimal have to cast back to int for class
        member.groupCredit = (int)group.groupCredit;
    }
}
于 2014-05-23T22:52:46.153 に答える