gpt4 book ai didi

c# - LINQ 中的条件 GroupBy()

转载 作者:太空狗 更新时间:2023-10-29 23:20:39 24 4
gpt4 key购买 nike

我正在处理一个充满项目之间相似性的矩阵。我将这些保存为数据库中的对象列表。相似度对象如下所示:

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 是用户评论过的项目的 guid 列表,Similarities 是与用户评论过的项目相似的所有项目的列表.我使用此函数检索该列表:

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

其中 itemIds 是用户评论过的项目的 guid 列表。

有没有办法根据 Where 子句按第一个或第二个索引进行分组?

如果我需要详细说明,请告诉我!

最佳答案

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

上面的直接 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();

关于c# - LINQ 中的条件 GroupBy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40783325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com