我正在处理一个填充有项目之间相似性的矩阵。我将它们另存为数据库中的对象列表。相似对象看起来像这样:
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
,可以确保其中包含FirstIndex
或SecondIndex
包含在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] 删除。
我来说两句