在我的应用程序中,我有一个场景,我得到一个未知类型的列表,可以是int \ long \ short。
我需要将此列表转换为double。
实现这一目标的最快捷,最有效的方法是什么? (它需要尽可能快)
答案 0 :(得分:3)
我假设您有List<object>
,您需要将其转换为List<double>
试试这个,这适用于实现IConvertible
的所有类型。 long
,int
,short
,float
等......
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);
这会以改变成本的方式发生变化。你将在恒定时间内返回,但实际使用该列表将更加昂贵。但是,如果您只是查看几个字段,或者可能只是获取计数然后通过它进行枚举,那么事实上这不会完整复制可以使它更有效。