using System;
using System.Collections.Generic;
namespace Masuit.Tools.RandomSelector;
///
/// 多选器
///
///
internal class MultipleSelector : SelectorBase
{
internal MultipleSelector(WeightedSelector weightedSelector) : base(weightedSelector)
{
}
internal IEnumerable Select(int count)
{
Validate(ref count);
var items = new List>(WeightedSelector.Items);
int result = 0;
do
{
var item = WeightedSelector.Option.AllowDuplicate ? BinarySelect(items) : LinearSelect(items);
yield return item.Value;
result++;
if (!WeightedSelector.Option.AllowDuplicate)
{
items.Remove(item);
}
} while (result < count);
}
private void Validate(ref int count)
{
if (count <= 0)
{
throw new InvalidOperationException("筛选个数必须大于0");
}
var items = WeightedSelector.Items;
if (items.Count == 0)
{
count = 0;
return;
}
if (!WeightedSelector.Option.AllowDuplicate && items.Count < count)
{
count = items.Count;
}
}
}