LINQ中的条件GroupBy()

用户名

我正在处理一个填充有项目之间相似性的矩阵。我将它们另存为数据库中的对象列表。相似对象看起来像这样:

public class Similarity
{
    public virtual Guid MatrixId { get; set; } //The id of the matrix the similarity is in
    public virtual Guid FirstIndex { get; set; } //The id of the item of the left side of the matrix
    public virtual Guid SecondIndex { get; set; } //The id of the item of the top side of the matrix
    public virtual double Similarity { get; set; } //The similarity
}

用户可以查看这些项目。我想检索与用户查看过的项目“相似”的项目列表。问题是我无法确定项目的ID是在FirstIndex还是在SecondIndex我已经写了一些代码来满足我的要求,但是我想知道是否可以在1条语句中做到这一点。

var itemsNotReviewed = Similarities.Where(x => !itemsReviewed.Contains(x.SecondIndex))
    .GroupBy(x => x.SecondIndex)
    .ToList();
itemsNotReviewed.AddRange(Similarities.Where(x => !itemsReviewed.Contains(x.FirstIndex))
     .GroupBy(x => x.FirstIndex)
     .ToList());

itemsReviewed用户查看过的项目的指导清单在哪里,而与用户查看过Similarities的项目相似的所有项目的列表在哪里我使用以下功能检索该列表:

return (from Row in _context.SimilarityMatrix
        where itemIds.Contains(Row.FirstIndex) || itemIds.Contains(Row.SecondIndex)
        select Row)
        .Distinct()
        .ToList();

itemIds用户已查看的项目的指导清单在哪里

有没有一种方法可以根据Where子句对第一个索引或第二个索引进行分组?

请让我知道是否应该详细说明!

伊万·斯托夫

据我了解,您有一个列表Similarity,可以确保其中包含FirstIndexSecondIndex包含在itemsReviewed中的项目Guid而且,您需要获取没有包含任何一个索引的元素(如果有的话)itemsReviewed(由于第一个约束,可能只是其中一个),并按该索引进行分组。

上面的简单LINQ转换将是这样的:

var itemsNotReviewed = Similarities
    .Where(item => !itemsReviewed.Contains(item.FirstIndex) || !itemsReviewed.Contains(item.SecondIndex))
    .GroupBy(item => !itemsReviewed.Contains(item.FirstIndex) ? item.FirstIndex : item.SecondIndex)
    .ToList();

但是它包含重复itemsReviewed.Contains检查,这会对性能产生负面影响。

因此,一个更好的变体是引入中间变量,而最简单的方法是查询语法和let子句:

var itemsNotReviewed =
    (from item in Similarities
     let index = !itemsReviewed.Contains(item.FirstIndex) ? 1 :
            !itemsReviewed.Contains(item.SecondIndex) ? 2 : 0
     where index != 0
     group item by index == 1 ? item.FirstIndex : item.SecondIndex)
    .ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章