使用具有多个比较值的Lambda表达式

时间:2013-12-05 16:32:09

标签: c# visual-studio-2010 lambda

id喜欢将一组对象中的某个属性与数组进行比较,如下所示:

List<Entity.Error> errorList = new List<Entity.Error>();
Guid[] guids = GetArrayOfGuids();
errorList.AddRange(Entity.ErrorCollection.errorCollection.Where(x => x.id == guids));

我希望这可以不使用:

foreach(Guid g in guids)
    errorList.AddRange(Entity.ErrorCollection.errorCollection.Where(x => x.id == g));

所以,如果您有任何想法,请告诉我。


编辑:

这有效:

var query = from error in Entity.ErrorCollection.errorCollection
                    join guid in GetArrayOfGuids()
                    on error.product.id equals guid1
                    select error;
        errorList.AddRange(query);

但是error.products.version是一个Entity.Version的List,我也想通过另一个Guid []查询。这可能在一个连接中,或者我是否需要在“var query”上进行第二次连接?

2 个答案:

答案 0 :(得分:1)

您在逻辑上做的是join

var query = from error in errorList
    join guid in GetArrayOfGuids()
    on error.id equals guid
    select error;

这将产生与第二个查询相同的结果,但它会更有效地完成。请注意,如果guid符合多个错误,您的结果中最终会出现重复错误。如果您想避免这种情况,请使用群组加入或致电Distinct

答案 1 :(得分:0)

您可以测试guids数组(或列表)是否包含id:

errorList.AddRange(
    Entity.ErrorCollection.errorCollection
        .Where(x => guids.Contains(x.id))
);

请注意,扫描阵列需要花费与阵列长度成比例的时间。因此,仅将此技术应用于短数组和列表。因为阵列扫描的开销很小 - 例如没有要计算的哈希码 - 但是,如果你只有几个guid,它可以比更精细的算法更快。

对于大量guids,请将其添加到HashSet<Guid>。 HashSets具有持续的访问时间,即无论你有5个guid还是500个guid都没有区别。 where子句保持不变。

相关问题