对于 2 值集数据,很明显我可以使用 Dictionary。例如:如果我有“名称”和“位置”作为键值对,我可以使用字典。
3值集呢?我应该使用什么合适的数据集?我有Name
, level
, position
. 唯一独特的是位置。
IE
Item1, port0, line20;
Item1, port1, line21;
Item2, port0, line22;
Item2, port1, line23;
为什么不创建一个合适的类呢?很简单,很短,很有意义。
public class FooBar
{
public string Name {get; set;}
public string Level {get; set;}
public string Position {get; set;}
}
然后将其放入List<FooBar>
or Dictionary<string, FooBar>
(其中关键是Position
)。
创建List
orDictionary
允许您通过其属性轻松获取项目
var list = new List<FooBar>() {..., ..., ...};
var item = list.Single(f => f.Position == "line21"); // etc.
var other = list.Single(f => f.Name == "Item1");
您不想创建自己的类型,这就是class
andstruct
关键字的用途。
public struct My3ValueThing
{
public string Name;
public int Level;
public string Position;
}
然后你可以做
ISet<My3ValueThing> dataset = new HashSet<My3ValueThing>();
如果您想将数据保存在 a 中Dictionary
并通过某个唯一键查找您的项目,假设Position
您可以这样做,
IDictionary<string, My3ValueThing> data =
new Dictionary<string, My3ValueThing>();
并添加这样的项目
var newItem = new My3ValueThing
{
Name = "Item1",
Port = 0,
Position = "Line20"
};
data.Add(newItem.Position, newItem);
您可以考虑使用Tuple
.
Tuple<string, string, string> myTuple = new Tuple<string, string, string>();
您可能遇到的唯一问题是它们并不像Dictionary
可能那样独特。
MSDN 文档在这里
构建一个自定义对象,用值填充它。构建实例数组。然后使用字典作为散列到数组中。(字典,其中 int 是实例的索引。)
老实说,这个问题有很多答案,有很多警告,几乎不可能回答这个问题。您可能需要考虑向我们提供有关您要完成的任务的更多详细信息。
您也可以只创建一个类来建模您的数据并将其存储在任何IEnumerable
(例如List
)
public class Item
{
public Item(int item, int port, int line)
{
ItemNum = item;
PortNum = port;
LineNum = item;
}
public int ItemNum;
public int PortNum;
public int LineNum;
}
List<Item> l = new List<Item>();
l.Add(new Item(1, 0, 20));
l.Add(new Item(1, 1, 21));
...
对于二值集合数据,我们将使用 2-Tuple ( ) 的集合(HashSet<T>
或另一个ISet<T>
明显可能的实现,如果我们要做任何集合操作)Tuple<T1, T2>
,一个匿名类(在方便时 - 通常特别是在涉及 linq 时)或相关数据的自定义类。
我们将使用字典进行一键单值查找。
对于三值集数据,我们将使用一组 3-Tuple ( Tuple<T1, T2, T3>
) 和匿名类,或用于相关数据的自定义类。
如果你想要一个二元组键,一个值查找,然后使用Dictionary<Tuple<T1, T2> TValue>
.
编辑:如果您以前使用过框架版本Tuple
,那么您的工具包中确实应该有某种元组类,因为它经常出现。使用这样的东西作为起点:
public static class Tuple
{
public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
{
return new Tuple<T1, T2>(item1, item2);
}
public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
{
return new Tuple<T1, T2, T3>(item1, item2, item3);
}
}
public class Tuple<T1, T2> : IEquatable<Tuple<T1, T2>>
{
private readonly T1 _item1;
private readonly T2 _item2;
public Tuple(T1 item1, T2 item2)
{
_item1 = item1;
_item2 = item2;
}
public T1 Item1 { get { return _item1; } }
public T2 Item2 { get { return _item2; } }
public bool Equals(Tuple<T1, T2> other)
{
return
ReferenceEquals(this, other)
||
(
other != null
&& (ReferenceEquals(_item1, other._item1) || (_item1 != null && _item1.Equals(other._item1)))
&& (ReferenceEquals(_item2, other._item2) || (_item2 != null && _item2.Equals(other._item2)))
);
}
public override bool Equals(object obj)
{
return Equals(obj as Tuple<T1, T2>);
}
public override int GetHashCode()
{
int h1 = _item1 == null ? 0 : _item1.GetHashCode();
int h2 = _item2 == null ? 0 : _item2.GetHashCode();
return ((h1 << 5) + h1) ^ h2;
}
}
public class Tuple<T1, T2, T3> : IEquatable<Tuple<T1, T2, T3>>
{
private readonly T1 _item1;
private readonly T2 _item2;
private readonly T3 _item3;
public Tuple(T1 item1, T2 item2, T3 item3)
{
_item1 = item1;
_item2 = item2;
_item3 = item3;
}
public T1 Item1 { get { return _item1; } }
public T2 Item2 { get { return _item2; } }
public T3 Item3 { get { return _item3; } }
public bool Equals(Tuple<T1, T2, T3> other)
{
return
ReferenceEquals(this, other)
||
(
other != null
&& (ReferenceEquals(_item1, other._item1) || (_item1 != null && _item1.Equals(other._item1)))
&& (ReferenceEquals(_item2, other._item2) || (_item2 != null && _item2.Equals(other._item2)))
&& (ReferenceEquals(_item3, other._item3) || (_item3 != null && _item2.Equals(other._item3)))
);
}
public override bool Equals(object obj)
{
return Equals(obj as Tuple<T1, T2, T3>);
}
public override int GetHashCode()
{
int h1 = _item1 == null ? 0 : _item1.GetHashCode();
int h2 = _item2 == null ? 0 : _item2.GetHashCode();
int h3 = _item3 == null ? 0 : _item3.GetHashCode();
int h = ((h1 << 5) + h1) ^ h2;
return ((h << 5) + h) ^ h3;
}
}