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 查询(或 lambda 吗?)添加一些东西。就唯一性而言,虽然不确定,但现在我可以访问“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

您可以在处理列表之前删除任何重复项:

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 回答
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 回答
0

你在这里合乎逻辑地做的是Join

var newDocuments = documentDetails.Join(documents,
        documentDetail => documentDetail.Extension,
        document => document.Extension,
        (documentDetail, document) => document,
        StringComparer.InvariantCultureIgnoreCase)
    .Distinct();

(这可以在查询语法而不是方法语法中完成,但是您无法提供字符串比较器,它允许您比较字符串而无需转换它们的大小写。这是执行不区分大小写比较的适当方式。)

从功能的角度来看,此代码与您的第一个编辑版本完全相同,只是它的效率更高。您正在做的是将每个文档与每个详细记录配对,然后在假设每个列表中的项目都有一个“键”并且您想要这些键匹配的项目的情况下,只过滤掉您需要的那些。这是一个非常常见的操作,它有自己的特殊操作符(Join)。也可以比在您的代码中更大量地优化这种特定情况。Join 运算符只能创建它需要的那些对;它不需要匹配很多不属于一起的物品,只是为了以后扔掉它们。

于 2013-06-19T15:44:01.557 回答