0

この質問には 2 つの部分があります。

  1. 外側のループを取り除く方法はありますか

    List<Document> newDocuments = new List<Document>();
    foreach (DocumentDetail documentDetail in documentDetails)
    {
        newDocuments.AddRange(documents.FindAll(d => d.Extension.ToUpperInvariant() == documentDetail.Extension.ToUpperInvariant()));
    }
    
  2. 上記からわかるように、私は「拡張機能」を扱っているだけで、外側の foreach ループを保持することになったとしても、他のすべてのプロパティ (つまり、説明など) をチェックしたいので、内部部分への複数の呼び出しで終了し、現在説明を確認していると仮定すると、このようになります

    newDocuments.AddRange(documents.FindAll(d => d.Description.ToUpperInvariant() == documentDetail.Description.ToUpperInvariant()));
    

上記の問題は、ドキュメントの拡張子がたまたま .pdf で、説明と一致すると、ドキュメントが重複してしまう可能性があることです。

重複するドキュメントが追加されないようにするにはどうすればよいですか。linq クエリ (またはラムダ) に何かを追加できますか? 一意性に関しては、明確ではありませんが、今のところ、「documents」リストに保持されているすべてのドキュメントに対して一意の「documentno」にアクセスできます。

どちらかの部分の答えを知っている場合は、お知らせください。

感謝!

編集済み

これはどうですか?それは間違いなく機能しますが、これがこれを書く正しい方法であるかどうかわかりませんか?

List<Document> newDocs = (from documentDetail in documentDetails
                          from document in documents
                          where document.Extension.ToUpperInvariant() == documentDetail.Extension.ToUpperInvariant()
                           select document).Distinct().ToList();

foreach ループだけに固執した方がよいでしょうか?

上記を使用すると、ドキュメント リストに対して DocumentDetails リストの複数のプロパティをチェックしたい場合、次のような結果になります。

        List<Document> newDocuments = null;

        if (documentDetails.FindAll(dd => (dd.Extension != null || !string.IsNullOrEmpty(dd.Extension))).Count > 0)
        {
            newDocuments = (from documentDetail in documentDetails
                            from document in documents
                            where document.Extension.ToUpperInvariant() == documentDetail.Extension.ToUpperInvariant()
                            select document).Distinct().ToList();
        }

        if (documentDetails.FindAll(dd => (dd.Description != null || !string.IsNullOrEmpty(dd.Description))).Count > 0)
        {
            newDocuments = (from documentDetail in documentDetails
                            from document in documents
                            where document.Description.ToUpperInvariant() == documentDetail.Description.ToUpperInvariant()
                            select document).Distinct().ToList();
        }

これを書いた方法が正しいことを誰かに確認してもらいたいのですが、結果を追加してからすべての重複を削除する方法がまだ残っています。すべてが完了したら、Distinct を適用できると思いますが、まだ「追加」の問題が残っています。どうすればいいですか?

ありがとう。

4

3 に答える 3

1

私は次のようなものを見ています: まだテストされていません - クラス定義が役立ちます!

var extensions = documentDetail.Select(d => d.Extension.ToUpperInvariant()).ToList();
var newDocuments = documents.Where(d => extensions.Contains(d.Extension.ToUpperInvariant())).ToList();
于 2013-06-19T15:32:02.643 に答える
1

リストを処理する前に、重複を取り除くことができます。

List<Document> newDocuments = new List<Document>();
List<Document> distinctItems = newDocuments .Distinct();
foreach (DocumentDetail documentDetail in documentDetails)
{
    newDocuments.AddRange(documents.FindAll(d => d.Extension.ToUpperInvariant() == documentDetail.Extension.ToUpperInvariant()));
}
于 2013-06-19T15:09:49.497 に答える