1

FrameListというカスタムオブジェクト(PONO)の配列があり、orderByとGroupByを使用して並べ替えとグループ化を行うことができます。しかし、今度は辞書を返したいのですが、エラーが発生します。

(ところで、エラーはありません。.ToDictionary()メソッドを削除します。)

エラー1'System.Linq.IGrouping'に'type'の定義が含まれておらず、タイプ'System.Linq.IGrouping'の最初の引数を受け入れる拡張メソッド'type'が見つかりませんでした(usingディレクティブまたはアセンブリリファレンス?)C:\ Users \ ysg4206 \ Documents \ Visual Studio 2010 \ Projects \ Watson \ CatalogServiceClasses \ BuildToby.cs 21 38 Watson

並べ替えとグループ化を行うスニペットは次のとおりです。

    var dict = request.FrameList.OrderBy(f => f.trueDate)
        .GroupBy(f => f.type)
        .ToDictionary(f => f.type, f => f);

これがFrameList(FrameDataの単純な配列)の定義です。

[DataContract]
public class FrameData
{
    [DataMember]
    public String idx { get; set; }
    [DataMember]
    public String type { get; set; }
    [DataMember]
    public String path { get; set; }
    [DataMember]
    public String date { get; set; }
    [DataMember]
    public DateTime trueDate { get; set; }
}
4

3 に答える 3

4

あなたが何をしようとしているのかは明確ではありません。

慣用的なマルチマップを作成するだけの場合は、次のことを試してください。

var lookup = request.FrameList.ToLookup(f => f.type);

Dictionaryクラスを使用してマルチマップを作成する場合は、次を試してください。

var dict = request.FrameList
                  .GroupBy(f => f.type)
                  .ToDictionary(g => g.Key, g => g.ToList());

どちらの場合も、OrderByルックアップとディクショナリは本質的に順序付けられていないコレクションであるため、グループ化する前は役に立たないことに注意してください。注文で何かを成し遂げようとしている場合(おそらく、グループ内のアイテムを日付順に注文したい場合)、明確にしてください。より適切なものを提供できる可能性があります。

編集:あなたのコメントに基づいて、あなたが必要としているように見えます:

var dict = request.FrameList
                  .GroupBy(f => f.type)
                  .ToDictionary(g => g.Key, 
                                g => g.OrderBy(f => f.trueDate)
                                      .ToList());
于 2013-03-18T16:39:53.503 に答える
2

メソッドのシグネチャがIDictionary<string,IList<FrameData>>

次のコードスニペットを使用してみてください。

var dict = request.FrameList
    .OrderBy(f => f.trueDate)
    .GroupBy(f => f.type)
    .ToDictionary(f => f.Key, f => f.ToList());
于 2013-03-18T16:35:26.807 に答える
1

GroupBy演算子は、IGroupingオブジェクトを返します。これらのオブジェクトにはKeyプロパティがあります。ただしtype、グループ化オブジェクト(エンティティのプロパティ)にはプロパティがありません。

 var dict = request.FrameList
        .OrderBy(f => f.trueDate)
        .GroupBy(f => f.type) // this selects IEnumerable<IGrouping>
        .ToDictionary(g => g.Key, g => g);

注:これがLinq to Entitiesクエリの場合GroupByIQueryable<IGrouping<TKey, TElement>>

于 2013-03-18T16:36:34.163 に答える