0

以下のようなエンティティ オブジェクトを取得しています。

{qid=1110, cid=94, gid=3, sid=10, cs=6}
{qid=1110, cid=95, gid=3, sid=10, cs=4}
{qid=1110, cid=96, gid=3, sid=10, cs=6}
{qid=1110, cid=97, gid=3, sid=10, cs=0}
{qid=1111, cid=94, gid=3, sid=10, cs=5}
{qid=1111, cid=95, gid=3, sid=10, cs=5}
{qid=1111, cid=96, gid=3, sid=10, cs=5}
{qid=1111, cid=97, gid=3, sid=10, cs=5}
{qid=1110, cid=94, gid=4, sid=10, cs=6}
{qid=1110, cid=95, gid=4, sid=10, cs=4}
{qid=1110, cid=96, gid=4, sid=10, cs=6}
{qid=1110, cid=97, gid=4, sid=10, cs=4}

しかし、次のように表示または変換する必要があります。

qid || cid1cs || cid2cs || cid3cs || cid4cs || avg_cs || gid || sid
----------------------------------------------------------------------
1110||    6   ||    4   ||    6   ||     0  ||   4    || 3   || 10
----------------------------------------------------------------------
1110||    6   ||    4   ||    6   ||     4  ||   5    || 4   || 10
----------------------------------------------------------------------
1111||    5   ||    5   ||    5   ||     5  ||   5    || 3   || 10
----------------------------------------------------------------------

cid1cs は cid=94 の cs、cid2cs= 95 の cs などです。 avg_cs は 4 つの cs (cid1cs、cid2cs..) すべての平均であり、グループ化と順序付けは gid、sid、qid で実行する必要があります。 .

LINQ でそれを行うことは可能ですか? 私はC#を使用しています

誰でも助けてもらえますか?

前もって感謝します

4

3 に答える 3

1

例を示しましたが、これは非常にエラーが発生しやすいことを覚えておいてください。しかし、それは機能します。行数が 4 未満の場合、失敗します。

GetHashCode() のより良い実装があると思いますが、これは機能します。

    public class Triplet : IEquatable<Triplet>
    {
        public int Value1 { get; set; }
        public int Value2 { get; set; }
        public int Value3 { get; set; }

        public override int GetHashCode()
        {
            return Value1.GetHashCode() + Value2.GetHashCode() + Value3.GetHashCode();
        }

        public bool Equals(Triplet other)
        {
            int d1 = this.Value1.CompareTo(other.Value1);
            if (d1 != 0)
                return false;

            int d2 = this.Value2.CompareTo(other.Value2);
            if (d2 != 0)
                return false;

            int d3 = this.Value3.CompareTo(other.Value3);
            if (d3 != 0)
                return false;

            return true;
        }
    }

このlinqコード:

        var data = new[] 
        {
            new {qid=1110, cid=94, gid=3, sid=10, cs=6},
            new {qid=1110, cid=95, gid=3, sid=10, cs=4},
            new {qid=1110, cid=96, gid=3, sid=10, cs=6},
            new {qid=1110, cid=97, gid=3, sid=10, cs=0},
            new {qid=1111, cid=94, gid=3, sid=10, cs=5},
            new {qid=1111, cid=95, gid=3, sid=10, cs=5},
            new {qid=1111, cid=96, gid=3, sid=10, cs=5},
            new {qid=1111, cid=97, gid=3, sid=10, cs=5},
            new {qid=1110, cid=94, gid=4, sid=10, cs=6},
            new {qid=1110, cid=95, gid=4, sid=10, cs=4},
            new {qid=1110, cid=96, gid=4, sid=10, cs=6},
            new {qid=1110, cid=97, gid=4, sid=10, cs=4}
        };

        var avg = from item in data
                  group item by new Triplet { Value1 = item.qid, Value2 = item.gid, Value3 = item.sid } into groupedItems
                  select new
                  {
                      qid = groupedItems.Key,
                      cid1cs = groupedItems.First().cs,
                      cid2cs = groupedItems.Skip(1).First().cs,
                      cid3cs = groupedItems.Skip(2).First().cs,
                      cid4cs = groupedItems.Skip(3).First().cs,
                      avg_cs = groupedItems.Average(i => i.cs),
                      gid = groupedItems.First().gid,
                      sid = groupedItems.First().sid
                  };
于 2013-08-12T08:27:21.073 に答える