gpt4 book ai didi

c# - Linq2sql : efficient way to get random elements with weight?

转载 作者:太空狗 更新时间:2023-10-30 00:28:51 26 4
gpt4 key购买 nike

Byt 假设我有一个整数权重,即权重为 10 的元素被选中的概率比权重为 1 的元素高 10 倍。

var ws = db.WorkTypes
.Where(e => e.HumanId != null && e.SeoPriority != 0)
.OrderBy(e => /*????*/ * e.SeoPriority)
.Select(e => new
{
DescriptionText = e.DescriptionText,
HumanId = e.HumanId
})
.Take(take).ToArray();

当我需要对结果进行加权时,如何解决在 Linq 中获取随机记录?

我需要像 Random Weighted Choice in T-SQL 这样的东西但在 linq 中不仅获得一条记录?

如果我没有加权要求,我会使用 NEWID 方法,我可以采用某种方式吗?

partial class DataContext
{
[Function(Name = "NEWID", IsComposable = true)]
public Guid Random()
{
throw new NotImplementedException();
}
}

...

var ws = db.WorkTypes
.Where(e => e.HumanId != null && e.SeoPriority != 0)
.OrderBy(e => db.Random())
.Select(e => new
{
DescriptionText = e.DescriptionText,
HumanId = e.HumanId
})
.Take(take).ToArray();

最佳答案

我的第一个想法与 Ron Klein 的相同 - 创建一个加权列表并从中随机选择。

这是一个 LINQ 扩展方法,用于从普通列表创建加权列表,给定一个知道对象权重属性的 lambda 函数。

如果您没有立即获得所有泛型的东西,请不要担心......下面的用法应该更清楚:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class Item
{
public int Weight { get; set; }
public string Name { get; set; }
}

public static class Extensions
{
public static IEnumerable<T> Weighted<T>(this IEnumerable<T> list, Func<T, int> weight)
{
foreach (T t in list)
for (int i = 0; i < weight(t); i++)
yield return t;
}
}

class Program
{
static void Main(string[] args)
{
List<Item> list = new List<Item>();
list.Add(new Item { Name = "one", Weight = 5 });
list.Add(new Item { Name = "two", Weight = 1 });

Random rand = new Random(0);

list = list.Weighted<Item>(x => x.Weight).ToList();

for (int i = 0; i < 20; i++)
{
int index = rand.Next(list.Count());
Console.WriteLine(list.ElementAt(index).Name);
}

Console.ReadLine();
}
}
}

正如您从输出中看到的那样,结果既是随机的又是根据您的需要加权的。

关于c# - Linq2sql : efficient way to get random elements with weight?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1789131/

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