list属性包含两种类型(string / int)

时间:2014-09-09 21:47:54

标签: c#

我需要一个属性,它将是一个可以包含整数和字符串的数组。 如果我将属性设置为一个整数数组,它应该是整数,所以当我搜索这个数组时搜索会很快,而在奇数时候这个属性也会包含搜索速度很慢的字符串。 除了以下内容之外是否还有其他方法可以包含包含本机类型的列表

  1. 两个属性,一个用于整数,一个用于字符串
  2. 使用List<对象>
  3. 更新 用例如下。我有一个数据库字段[ReferenceNumber],它包含值(整数和字符串)和另一个字段[SourceID](用于其他东西),可用于确定记录是否包含int或字符串。

    我将根据源ID获取这些记录的集合,当然,根据源的不同,列表将是整数或字符串。然后我将通过这个集合寻找某些参考数字,如果它们不存在或者他们不添加它们。我将预先获取大量记录,而不是一遍又一遍地访问数据库。

    所以例如,如果我得到sourceid = 1的列表,这意味着它们是整数,如果搜索我想要下划线列表为int,那么搜索将很快。并且如果sourceid说是2,这意味着它们是字符串并且非常罕见,如果搜索速度很慢,因为那些记录数量不是很多,并且通过字符串搜索的性能很好。

4 个答案:

答案 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>();
    }
}