1

次のような LINQ ステートメントから返される結果があります。

 Id dataId dataVal 
 A  1      1000 
 A  2      2000 
 A  3      3000 
 A  3      3001 
 A  3      3002

私が望むのは、最初のアイテム(dataId = 3およびdataVal = 3000)を取得することです

上記の結果を生成しているクエリは次のとおりです。

        var myIds = myList
            .Where(a => ListIds.Contains(a.dataId))
            .Select(x=> new 
            {
                Id = x.Id,
                DataId = x.dataId,
                DataValue = x.DataValue
            }).ToList().Distinct();

グループ化を行う必要がありますか、それとももっと簡単な方法がありますか?

4

2 に答える 2

3

アイテムをdataIdでグループ化し、各グループから最初のアイテムを選択します。

var myIds = (from a in myList
             where ListIds.Contains(a.dataId)
             group a by a.dataId into g
             let firstA = g.OrderBy(x => x.DataValue).First()
             select new {
                Id = firstA.Id,
                DataId = g.Key,
                DataValue = firstA.DataValue
             }).ToList();

または拡張メソッドを使用する場合(最初のアイテムを元の順序で返します):

var myIds = myList
        .Where(a => ListIds.Contains(a.dataId))
        .GroupBy(a => a.dataId)
        .Select(g => new 
        {
            Id = g.First().Id,
            DataId = g.Key,
            DataValue = g.First().DataValue
        }).ToList();
于 2013-02-15T18:58:02.913 に答える
1

選択後に.FirstOrDefault()を使用します

 var myIds = myList
                .Where(a => ListIds.Contains(a.dataId))
                .Select(x=> new 
                {
                    Id = x.Id,
                    DataId = x.dataId,
                    DataValue = x.DataValue
                }).FirstOrDefault();
于 2013-02-15T18:58:18.763 に答える