我需要一个属性,它将是一个可以包含整数和字符串的数组。 如果我将属性设置为一个整数数组,它应该是整数,所以当我搜索这个数组时搜索会很快,而在奇数时候这个属性也会包含搜索速度很慢的字符串。 除了以下内容之外是否还有其他方法可以包含包含本机类型的列表
更新 用例如下。我有一个数据库字段[ReferenceNumber],它包含值(整数和字符串)和另一个字段[SourceID](用于其他东西),可用于确定记录是否包含int或字符串。
我将根据源ID获取这些记录的集合,当然,根据源的不同,列表将是整数或字符串。然后我将通过这个集合寻找某些参考数字,如果它们不存在或者他们不添加它们。我将预先获取大量记录,而不是一遍又一遍地访问数据库。
所以例如,如果我得到sourceid = 1的列表,这意味着它们是整数,如果搜索我想要下划线列表为int,那么搜索将很快。并且如果sourceid说是2,这意味着它们是字符串并且非常罕见,如果搜索速度很慢,因为那些记录数量不是很多,并且通过字符串搜索的性能很好。
答案 0 :(得分:2)
我将浏览此集合以查找某些参考编号,如果它们不存在,或者他们不添加它们。
听起来我觉得你不需要List<>
,而是HashSet<>
。只需使用HashSet<object>
和Add()
所有项目,集合将忽略重复项目。无论您是处理int
还是string
,都会超级快。
在我的计算机上,以下代码显示在hashset中填充初始400,000个唯一字符串大约需要50毫秒,而添加10,000个随机字符串大约需要2毫秒:
var sw = new Stopwatch();
var initial= Enumerable.Range(1, 400000).Select(i => i.ToString()).ToList();
sw.Start();
var set = new HashSet<object>(initial);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
var random = new Random();
var additional = Enumerable.Range(1, 10000).Select(i => random.Next(1000000).ToString()).ToList();
sw.Restart();
foreach (var item in additional)
{
set.Add(item);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
此外,如果它很重要,HashSet<>
保留插入顺序。
答案 1 :(得分:0)
我建议的另一件事是实现IComparable
的自定义对象class Multitype: IComparable
{
public int? Number { get; set; }
public string Words {get; set; }
public int CompareTo(object obj)
{
Multitype other = obj as Multitype;
if (Number != null && other != null && other.Number != null)
{
//...
}
else
{
//...
}
}
}
数字之间会有一些额外的比较步骤,但不如字符串解析那么多。
您是否存储了大量数据,性能差异真的很重要吗?
答案 2 :(得分:0)
如果通过“使用列表”表示对象原语或提供System.Object
,这是一个选项,但我认为您应该制作自己的包装对象 - IntString
或类似 - - 这会为你处理一切。它应该像其他gal提到的那样实现IComparable
。
您可以通过编写完全符合您需要的CompareTo
方法来提高对集合中对象进行排序的效率。编写一个好的CompareTo
方法本身就是一整套蠕虫,所以你应该为此开始一个新的问题,如果那就是你想要的。
如果您正在寻找在实例化时强类型为List<Int>
或List<String>
的属性,但可以在之后进行更改,那么您需要一个接口。 IList
存在,但不会对您有所帮助,因为在声明时也必须强类型。您应该制作IIntStringList
之类的内容,只能是List<Int>
或List<String>
中的一个。{1}}。
很抱歉,这个答案没有那么多细节(我现在需要离开办公室),但我希望我能让你走上正轨。
答案 3 :(得分:0)
如果在课堂上实现泛型,则可以使用泛型。不确定这是否解决了您的问题。有兴趣听听可以有不同类型的属性的真实示例。
class Foo<T>
{
public List<T> GenericList { get; set; }
public Foo()
{
this.GenericList = new List<T>();
}
}