删除随机条目,直到收集为空

时间:2015-03-11 01:02:11

标签: c# dictionary collections types unity3d

我很确定这是基本的东西,但由于某种原因,我似乎无法让它发挥作用。首先,我不确定我应该使用哪种收藏类型。我在我的Unity游戏中使用C#,我想存储这样的信息:

#  Name  Number Value
1  Jim   15
2  Bob   21
3  Tim   31
4  Ron   26

数字1-4将是索引,所以如果我用Tim删除条目#3,表格看起来像:

#  Name  Number Value
1  Jim   15
2  Bob   21
3  Ron   26

我认为我应该使用词典,这就是我尝试过的。我想用我的代码做的是选择一个随机元素,打印然后删除它。冲洗并重复,直到列表为空。

这是我一直用于我的代码:

Dictionary<String, int> myDictionary = new Dictionary<String, int> ();
void Start()
{
  myDictionary.Add ("Jim", 15);
  myDictionary.Add ("Bob", 21);
  myDictionary.Add ("Tim", 31);
  myDictionary.Add ("Ron", 26);
}

void Update()
{
  int totalEntries = myDictionary.Count;
  int randNumber = Random.Range(1,totalEntries);
  print(myDictionary[randNumber]);
  myDictionary.Remove(randNumber);
}

它不起作用。我已经看到了一些关于使用RemoveAt或使用HashTable的建议但我无法让那些工作。由于某种原因,RemoveAt不被识别为命令,而HashTable只是有同样的问题。我正在使用“使用System.Collections.Generic;”顺便说一句,这不是问题。我想提一下,我对C#很陌生,所以对我来说最有帮助的就是我可以编辑的实际工作代码以适应我的游戏。

4 个答案:

答案 0 :(得分:1)

在这种情况下,词典并不理想 我使用List Tuples(或自定义类的List)。

List<Tuple<int, String, int>> myItems = new List<Tuple<int, String, int>>();
void Start()
{
  myItems.Add(Tuple.Create(1, "Jim", 15));
  myItems.Add(Tuple.Create(2, "Bob", 21));
  myItems.Add(Tuple.Create(3, "Tim", 31));
  myItems.Add(Tuple.Create(4, "Ron", 26));
}

现在有两种方法可以识别您要删除的对象。首先是您的初始方法(通过列表中的索引):

void Update()
{
  var rnd = new Random();
  var randNumber = rnd.Next(0, myItem.Count);
  myItems.Remove(myItems.ElementAt(randNumber));
}

然后按对象的实际值:

void Update2()
{
  var minValue = myItems.Min(i => i.Item1);       // Gets the minimum value in first column (so to speak);
  var maxValue = myItems.Max(i => i.Item1);       // Gets the maximum value.
  var rnd = new Random();
  var randNumber = rnd.Next(minValue, maxValue + 1);  // maximum value in Random.Next is exclusive.
  var myObject = myItems.SingleOrDefault(o => o.Item1 == randNumber);
  if (myObject != null)
    myItems.Remove(myObject);
}

您更喜欢哪种方法取决于您和解决任务的要求。您可能更喜欢索引,但另一方面,您可能更喜欢按值删除。

第二种方法的缺点是,当已经删除随机值时,您可能根本不会删除对象。

答案 1 :(得分:0)

试试这个:

using System.Linq;

var r = new Random();
var i = r.Next(0, dic.Count);
var e = dic.ElementAt(i)
dic.Remove(e);

答案 2 :(得分:0)

创建一个长度相同的数组,并在每个单元格中输出一个数字1到N.并随机播放该数组。然后按索引删除每一行

答案 3 :(得分:0)

我最终找到了这个链接:http://wiki.unity3d.com/index.php/Choosing_the_right_collection_type

并且已经能够使用ArrayLists解决我的问题。这是真正帮助我的链接的一部分:

ArrayList myArrayList = new ArrayList();    // declaration
myArrayList.Add(anItem);                    // add an item to the end of the array
myArrayList[i] = newValue;                  // change the value stored at position i
TheType thisItem = (TheType) myArray[i];    // retrieve an item from position i
myArray.RemoveAt(i);                        // remove an item from position i
var howBig = myArray.Count;                 // get the number of items in the ArrayList

感谢大家的所有消遣!