使用GetEnumerator进行字典初始化C#

时间:2016-05-27 15:25:55

标签: c# dictionary static initialization enumeration

我将课程Cluster.cs定义为:

public class Cluster
{
        protected int _clusterID = -1;
        private static int _clusterCount = 0;

        protected int _attributeCount;
        // _clusterObjects contains EvoObjects in this cluster. 
        protected List<EvoObject> _clusterObjects = new List<EvoObject>();

        /** _nkA[_i] is the total occurrences of the attribute _i in this cluster*/
        protected Int32[] _nkA;

        // For each attribute, record their values as KeyValuePair.

        protected Dictionary<Int32, UtilCS.KeyCountMap<Int32>> _attributeValues = new Dictionary<Int32, UtilCS.KeyCountMap<Int32>>();

        public Cluster(int _clusterID, int _attributeCount)
        {
            this._clusterID = _clusterID;
            this._attributeCount = _attributeCount;
            _nkA = new Int32[_attributeCount];
        }

        // Initialize _attributeValues
        IEnumerable<Int32>  _range = Enumerable.Range(0, _attributeCount).GetEnumerator(_i => {_attributeValues[_i] = new UtilCS.KeyCountMap<Int32>()});
}  

在初始化_attributeValues时,出现错误:

  

&#34; GetEnumerator没有重载方法需要1个参数&#34;

而我只有一个参数来初始化,即_attributeValues,这实际上是一个字典,为什么必须枚举它。

此外,如果我声明_attributeCount静态,我无法在构造函数中使用它,如果我声明它是非静态的,我无法使用它Range方法Enumberable。

我如何初始化_attributeValues呢? 如何声明_attributeCount静态或非静态?

2 个答案:

答案 0 :(得分:0)

Enumerable.Range(0, _attributeCount).ToList().ForEach(x => _attributeValues.Add(x, new UtilCS.KeyCountMap<Int32>()));

答案 1 :(得分:0)

看起来你试图通过使用在创建对象时设置的变量(_range)来初始化Dictionary。这应该移动到构造函数中。您似乎正在尝试使用键0,1,2和新UtilCS.KeyCountMap()的值创建三个新属性。

如果这是正确的,那么我建议使用它作为你的构造函数。

public Cluster(int _clusterID, int _attributeCount)
{
  this._clusterID = _clusterID;
  this._attributeCount = _attributeCount;
  _nkA = new Int32[_attributeCount];

  for (var i = 0; i < 3; i++)
  {
    _attributeValues.Add(i, new UtilCS.KeyCountMap<int>());
  }
}

但是,由于您要发送_attributeCount,我会说您可以使用它而不是3。

public Cluster(int _clusterID, int _attributeCount)
{
  this._clusterID = _clusterID;
  this._attributeCount = _attributeCount;
  _nkA = new Int32[_attributeCount];

  for (var i = 0; i < _attributeCount; i++)
  {
    _attributeValues.Add(i, new UtilCS.KeyCountMap<int>());
  }
}