在C#中,我尝试从列表中的随机索引处获取一个项目。检索到它后,我希望将其删除,以便无法再选择它。似乎我需要执行很多操作,难道没有可以从列表中提取项目的功能吗? RemoveAt(index)函数无效。我想要一个带有返回值的商品。

我在做什么:

List<int> numLst = new List<int>();
numLst.Add(1);
numLst.Add(2);

do
{
  int index = rand.Next(numLst.Count);
  int extracted = numLst[index];
  // do something with extracted value...
  numLst.removeAt(index);
}
while(numLst.Count > 0);

我想做的是:
List<int> numLst = new List<int>();
numLst.Add(1);
numLst.Add(2);

do
{
  int extracted = numLst.removeAndGetItem(rand.Next(numLst.Count));
  // do something with this value...
}
while(numLst.Count > 0);

是否存在这样的“removeAndGetItem”函数?

最佳答案

不可以,因为这违反了纯函数礼节,在这种情况下,方法要么具有副作用,要么返回有用的值(即,不仅表明错误状态),而且永远不会两者兼有。

如果希望函数显示为原子,则可以在列表上获取一个锁,如果其他线程也使用lock,则该线程将阻止您在修改列表时访问该列表:

public static class Extensions
{
    public static T RemoveAndGet<T>(this IList<T> list, int index)
    {
        lock(list)
        {
            T value = list[index];
            list.RemoveAt(index);
            return value;
        }
    }
}

10-08 02:20