質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

2回答

3113閲覧

.Net環境で、DropBoxファイルを取得するときに、日付順にソートして最後の値のデータを取得したいです。

nomurax

総合スコア32

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2018/01/28 09:11

###前提・実現したいこと
こんにちは。いつもたいへんお世話になります。
本日はVisual Studio 2017 CommunityでDropboxのApplicationについてで困っていることがあります。

先の質問の継続質問になります。
Dropboxでファイルを取得するときに、日付順にソートして最後の値のデータを取得したいです。
LINQを使うと、ソートして最後であれば、

C#

1 .OrderBy(file => file.ClientModified) 2 .LastOrDefault();

となると思います。

じっさいのコードでは、

C#

1public async Task<Metadata> GetLatestFile() 2{ 3 var files = await client.Files.ListFolderAsync("/Image"); 4 var item = files.Entries 5 .Where(file => file.IsFile) 6 //.OrderBy(file => file.ClientModified)//この行を書けない。 7 .LastOrDefault(); 8 return item; 9}

となるかと。

###発生している問題・エラーメッセージ
VisualStudioでブレークポイントを置いて、filesとitemを見ると、filesのEntriesには、下記の通り、Dropbox.Api.Files.Metadataが入っていますが、コードで、そのなかでインテリセンスで書けるのは限られていて、その限られているなかに日付(ClientModifiedとServerModified)はありません。
OrderByをコメントアウトした状態では、単にファイル名の最後のファイルを取得してしまいます。
このようなときには、どうやってModifiedの最新のファイルを取得すればよいのでしょう?

-Entries Count = 4 System.Collections.Generic.IList<Dropbox.Api.Files.Metadata> {System.Collections.Generic.List<Dropbox.Api.Files.Metadata>} - [0] {Dropbox.Api.Files.FileMetadata} Dropbox.Api.Files.Metadata {Dropbox.Api.Files.FileMetadata} + AsDeleted null Dropbox.Api.Files.DeletedMetadata + AsFile {Dropbox.Api.Files.FileMetadata} Dropbox.Api.Files.FileMetadata + AsFolder null Dropbox.Api.Files.FolderMetadata + ClientModified {2018/01/28 5:24:42} System.DateTime ContentHash "f3242" string HasExplicitSharedMembers null bool? Id "id:AAEg" string IsDeleted false bool IsFile true bool IsFolder false bool + MediaInfo null Dropbox.Api.Files.MediaInfo Name "A.jpg" string ParentSharedFolderId null string PathDisplay "/Image/A.jpg" string PathLower "/image/a.jpg" string PropertyGroups null System.Collections.Generic.IList<Dropbox.Api.FileProperties.PropertyGroup> + ServerModified {2018/01/28 8:30:22} System.DateTime + SharingInfo null Dropbox.Api.Files.FileSharingInfo Size 499704 ulong - [1] {Dropbox.Api.Files.FileMetadata} Dropbox.Api.Files.Metadata {Dropbox.Api.Files.FileMetadata} + AsDeleted null Dropbox.Api.Files.DeletedMetadata + AsFile {Dropbox.Api.Files.FileMetadata} Dropbox.Api.Files.FileMetadata + AsFolder null Dropbox.Api.Files.FolderMetadata + ClientModified {2018/01/28 8:31:24} System.DateTime ContentHash "757ee" string HasExplicitSharedMembers null bool? Id "id:AAFQ" string IsDeleted false bool IsFile true bool IsFolder false bool + MediaInfo null Dropbox.Api.Files.MediaInfo Name "D.jpg" string ParentSharedFolderId null string PathDisplay "/Image/D.jpg" string PathLower "/image/d.jpg" string PropertyGroups null System.Collections.Generic.IList<Dropbox.Api.FileProperties.PropertyGroup> + ServerModified {2018/01/28 8:31:35} System.DateTime + SharingInfo null Dropbox.Api.Files.FileSharingInfo Size 371415 ulong + 静的メンバー

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 Home 1709 64bit

Microsoft Visual Studio Community 2017
Version 15.1 (26403.3) Release
VisualStudio.15.Release/15.1.0+26403.3
Microsoft .NET Framework
Version 4.7.02556

インストールされているバージョン:Community

Visual C# 2017 00369-60000-00001-AA631

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x_x

2018/02/13 06:35

先の質問というのはどれのことでしょうか?
guest

回答2

0

こんにちは。

Dropbox APIのドキュメントを見てみただけで何も試してない回答ですが。
以下のようにしたら動くんじゃないかなと思います。

csharp

1public async Task<FileMetadata> GetLatestFile() 2{ 3 var files = await client.Files.ListFolderAsync("/Image").ConfigureAwait(false); 4 var item = files.Entries 5 .Where(metadata => metadata.IsFile) // この時点ではMetadata型 6 .Select(metadata => metadata.AsFile) // FileMetadata型にする 7 .OrderByDescending(file => file.ClientModified) // 逆順にソートして 8 .FirstOrDefault(); // 先頭を取る 9 return item; 10}

Entriesプロパティが返すオブジェクトはMetadata型ですが、ClientModifiedプロパティが使えるのはFileMetadata型なので、Selectで型変換を行います。

ついでに、IEnumerableで最後の値を取る操作は全列挙を行うため効率が悪いです。逆順にソートするOrderByDescending関数があるので、それを使ってから先頭を取る方が良いです。
あと非同期APIを使うときは支障なければ.ConfigureAwait(false)付けといたほうがいいと思います。

しかしこの、抽象型を返してから型判定させるAPIはかなーり好きじゃないデザインですねえ。

投稿2018/02/13 04:17

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

上から六行目にあるのは違うのですか?

  • ClientModified {2018/01/28 5:24:42} System.DateTime

投稿2018/01/28 09:46

編集2018/01/28 09:48
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomurax

2018/02/10 00:42

すみません。ちがいます。
Zuishin

2018/02/10 01:12

では紛らわしい情報ではなくちゃんとした情報を載せてください、まで書かなくてはなりませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問