2010-08-13 85 views
7

我有一个列表,下面声明,在开始时默认列表项是{-1, - }。请注意,在整个程序列表尺寸固定为2.NET List最佳方法

List<int> list = new List<int>(new int[] {-1, -1}); 

我的问题是有关,这将是最好的办法,如果我需要覆盖在列表中的两个值。

int x = GetXValue(); 
int y = GetYValue(); 

方法1:

list = new List<int>(new int[] {x, y}); 

方法2:

list[0] = x; 
list[1] = y; 

什么会是一个更好的办法?采用第二种方法,即使我确信最初设置了2个值,但我可能会冒着Argument index out of range例外的风险。但是,第一种方法可能会吃更多的记忆(纠正我,如果我错了!),因为我每次创建一个新的列表。

有没有更简单,和/或更好的解决方案

回答

12

或者是有一个更简单,更好的 的解决方案?

是的。由于列表中有一个固定的大小,使用真正的对象,如System.Drawing.Point

Point p = new Point(1, -1); 
p = new Point(5, 10); 
Console.WriteLine("X = {0}, Y = {1}", p.X, p.Y); 
+0

好的呼叫点。我在想IDictionary 会完成相同的。 – 2010-08-13 22:32:00

+2

+1:使用(动态大小)列表会为该类型创建模糊性 - 现在必须依赖注释来指示预期用法。如果一个CLR类型不是一个需要的自定义结构或对象被调用。 – 2010-08-13 22:35:09

+0

+1 - 聪明的主意! – 2010-08-13 23:24:47

0

也许我不明白你的情况,但我认为一个更好的解决方案将是一个简单的数组?

int[] list = new int[] { -1, 1 }; 
+0

我个人觉得阵列不好。我的目标是试图避免它们。 – 2010-08-13 23:30:53

0

我会建议你使用一个数组,这意味着集合保持固定的大小和第二种访问它的方法。所以:

int[] array = new[] { -1, -1 }; 

,然后去改变它:

array[0] = x; 
array[1] = y; 

由于数组不改变尺寸,和2点的值被分配给它,你不会得到一个IndexOutOfRangeException。我通常不会使用第一种方法来更改集合的内容 - 通常最好更改现有对象而不是创建新对象。


正如顺便说一句,你可以写一个List<T>像一个初始化器:

new List<int> {-1, -1}; 
1

这看起来像是要进行封装,这在使用网站上删除的复杂性。

封装应提供所有行为,包括从-1, -1开始,并同时设置XY。你可以做这样的事情:

public class ItemSet 
{ 
    public ItemSet() 
    { 
     this.X = -1; 
     this.Y = -1; 
    } 

    public int X { get; private set; } 

    public int Y { get; private set; } 

    public void SetItems(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 
} 
1

为什么不能自定义类,像,特别是因为它是一个固定的大小。

class MyClass { 
    public MyClass(int x, int y) { 
    } 
    public int X { get; set; } 
    public int Y { get; set; } 

    public int[] ToArray() { 
     return new[] { X, Y }; 
    } 
    public List<int> ToList() { 
     return ToArray().ToList(); 
    } 
} 
+0

自定义类很好。但我觉得这只是需要维护的额外代码。谢谢你的想法。我喜欢使用getters和setter,使生活易于管理:) – 2010-08-13 23:28:52

1

结构可以工作得

public struct Point 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public Point(int x, int y):this() 
    { 
     this.X = x; 
     this.Y = y; 
    } 
} 

Point p = new Point(-1, -1); 
// ... 
p.X = newX; 
p.Y = newY; 
1

方法2将是更好,因为方法1导致不必要的内存分配(创建新的列表,阵列等)

然而,事实您的列表中只有2个项目,因此我认为列表是您的场景中使用的错误类。