30

私は次のようなデータを持っています:

UserId   |  SongId
--------   --------
1          1
1          4
1          12
2          95

次のクラスもあります。

class SongsForUser
{
    public int User;
    public List<int> Songs;
}

私がやりたいのは、LINQを使用してデータから選択し、SongsForUserオブジェクトのコレクションを作成することです。以下は私がこれまでに思いついたものです:

var userCombos = songs.UserSongs.Select(x => new SongsForUser() { User = x.UserId, 
                                                                  Songs = /*What goes here?*/ });

Songsリストにデータを入力するにはどうすればよいですか?

したがって、結果は2つのSongsForUserオブジェクトになります。ユーザー1の場合、リストには3つのアイテムが含まれSongsます。ユーザー2の場合、リストには1つのアイテムが含まれSongsます。

4

4 に答える 4

45
songs.UserSongs.GroupBy(x => x.User).Select(g => new SongsForUser() 
{ 
    User = g.Key,
    Songs = g.Select(s => s.SongId).ToList()
});
于 2012-07-19T05:28:39.627 に答える
20

私はあなたが欲しいと思う:

var songsByUser = songs.UserSongs
                       .GroupBy(song => song.UserId, song => song.SongId)
                       .Select(g => new SongsForUser { User = g.Key,
                                                       Songs = g.ToList() });

説明すると、GroupBy一連のグループが作成されます。各グループのキーはユーザー ID であり、グループ内の値は曲 ID です。

Key = 1, Values = 1, 4, 12
Key = 2, Value = 95

SongsForUser次に、それを自分のタイプに変換するだけです。オブジェクト初期化子でコンストラクターを呼び出すときに明示的に含める必要がないことに注意してください()。コンストラクターの引数を指定する必要がない限り、暗黙的です。

ちなみに、これはすべて 1 回の呼び出しで行うことができます。GroupBy

var songsByUser = songs.UserSongs
         .GroupBy(song => song.UserId, song => song.SongId,
                  (user, ids) => new SongsForUser { User = user,
                                                    Songs = ids.ToList() });

個人的には、通常、別のSelect呼び出しの方が読みやすいと思います。

これらすべてをクエリ式で行うこともできます。

var songsByUser = from song in songs.UserSongs
                  group song.SongId by song.UserId into g
                  select new SongsForUser { User = g.Key, Songs = g.ToList() };

編集:上記は「プロバイダー中立」ですが、LINQ to Entities では機能していないようです。次のように動作させることができる場合があります。

var songsByUser = songs.UserSongs
                       .GroupBy(song => song.UserId, song => song.SongId)
                       .AsEnumerable()
                       .Select(g => new SongsForUser { User = g.Key,
                                                       Songs = g.ToList() });

このAsEnumerable呼び出しにより、グループ化はデータベースで強制的に実行されますが、最終的な射影 (ToList呼び出しを含む) はローカルで実行されます。ただし、生成された SQL の効率を確認する必要があります。

于 2012-07-19T05:30:11.467 に答える
1

次のものがあるとしましょう。

public class SongsForUser
{
    public int UserId;
    public List<int> Songs;
}

次に、ここのような関数が実行されます。このリストは、テストするデータを保持するためのものです。

    public void Group()
    {
        List<Tuple<int, int>> SongRelations = new List<Tuple<int, int>>();

        SongRelations.Add(new Tuple<int, int>(1, 1));
        SongRelations.Add(new Tuple<int, int>(1, 4));
        SongRelations.Add(new Tuple<int, int>(1, 12));
        SongRelations.Add(new Tuple<int, int>(2, 95));

        var list = SongRelations.GroupBy(s => s.Item1)
                                .Select(r => new SongsForUser()
                                {
                                    UserId = r.Key,
                                    Songs = r.Select(t => t.Item2).ToList(),
                                });
    }

listその後、タイプ SongsForUser の 2 つのアイテムが含まれます。1 つはユーザー 1 と 1、4、12 を含む曲のリストで、もう 1 つはユーザー 2 と 95 を含む曲のリストです。

于 2012-07-19T05:35:42.360 に答える
0

最も単純な形式では、次のことができます。

List<MapPoint> points = db.PropertyResearches.Where(a => a.deptId == 66).Select(x => new MapPoint { property = x.notes.Substring(0, 10), latitude = x.lat, longitude = x.@long }).ToList();
于 2019-02-05T00:09:24.550 に答える