在C#中将未知的long \ int \ short转换为double

时间:2014-01-16 12:06:24

标签: c# double type-conversion

在我的应用程序中,我有一个场景,我得到一个未知类型的列表,可以是int \ long \ short。

我需要将此列表转换为double。

实现这一目标的最快捷,最有效的方法是什么? (它需要尽可能快)

3 个答案:

答案 0 :(得分:3)

我假设您有List<object>,您需要将其转换为List<double>

试试这个,这适用于实现IConvertible的所有类型。 longintshortfloat等......

var doubleList = objectList.Select(x=> Convert.ToDouble(x)).ToList();

答案 1 :(得分:2)

试试这个

List<double> doubleList = intList.ConvertAll(x => (double)x);

答案 2 :(得分:1)

非常简单:

var doubleList = listOfObjects.Select(i => Convert.ToDouble(i)).ToList();

微观优化,因为你说“最有效”很重要:

int count = listOfObjects.Count;
var doubleList = new List<double>(listOfObjects.Count);
for(int i = 0; i != count; ++i)
  doubleList.Add(Convert.ToDouble(listOfObjects[i]));

但是,“效率最高”取决于您最需要的效率。您可以通过以下方式获得不同的效率:

public class DoubleList : IList<double>
{
  private readonly List<object> _source; // Change to IList<object> if that's a possibility
  public DoubleList(List<object> source)
  {
    _source = _source;
  }
  // Hide half-supported implementation from main interface
  double IList<double>.this[int index]
  {
    get { return Convert.ToDouble(_source[index]); }
    set { throw new NotSupportedException("Read-only collection"); }
  }
  public double this[int index]
  {
    get { return Convert.ToDouble(_source[index]); }
  }
  public int Count
  {
    get { return _source.Count; }
  }
  bool ICollection<double>.IsReadOnly
  {
    get { return true; }
  }
  /* Lots of boring and obvious implementations skipped */
  public struct Enumerator : IEnumerator<double>
  {
    // note, normally we'd just use yield return in the
    // GetEnumerator(), and we certainly wouldn't use
    // a struct here (there are issues), but this
    // optimisation is in the spirit of "most efficient"
    private List<object>.Enumerator _en; //Mutable struct! Don't make field readonly!
    public double Current
    {
      get { return Convert.ToDouble(_en.Current); }
    }
    object IEnumerator.Current
    {
      get { return Current; }
    }
    public void Dispose()
    {
      _en.Dispose();
    }
    public bool MoveNext()
    {
      return _en.MoveNext();
    }
    public void Reset()
    {
      _en.Reset();
    }
  }
  public Enumerator GetEnumerator()
  {
    return new Enumerator(_source.GetEnumerator());
  }
  IEnumerator<double> IEnumerable<double>.GetEnumerator()
  {
    return GetEnumerator();
  }
  IEnumerator IEnumerable.GetEnumerator()
  {
    return GetEnumerator();
  }
}

var doubleList = new DoubleList(listOfObjects);

这会以改变成本的方式发生变化。你将在恒定时间内返回,但实际使用该列表将更加昂贵。但是,如果您只是查看几个字段,或者可能只是获取计数然后通过它进行枚举,那么事实上这不会完整复制可以使它更有效。