0

2つの値セットのデータについては、辞書を使用できることは明らかです。たとえば、キーと値のペアとして「名前」と「位置」がある場合は、辞書を使用できます。

3つの値セットはどうですか?使用する必要がある適切なデータセットは何ですか?私は、、を持ってNamelevelますposition。そして唯一のユニークなのは位置です。

すなわち

Item1, port0, line20; 
Item1, port1, line21; 
Item2, port0, line22; 
Item2, port1, line23;
4

7 に答える 7

3

適切なクラスを作成してみませんか?シンプルで、短く、意味があります。

public class FooBar
{
    public string Name {get; set;}
    public string Level {get; set;}
    public string Position {get; set;}
}

そして、それをList<FooBar>またはDictionary<string, FooBar>(キーはPosition)に入れます。

Listまたはを作成するDictionaryと、そのプロパティによってアイテムを簡単にフェッチできます

var list = new List<FooBar>() {..., ..., ...};
var item = list.Single(f => f.Position == "line21"); // etc.
var other = list.Single(f => f.Name == "Item1");
于 2012-09-12T14:48:16.440 に答える
3

独自のタイプを作成したくないのですが、それがキーワードclassstructキーワードの目的です。

public struct My3ValueThing
{
    public string Name;
    public int Level;
    public string Position;
}

その後、あなたはすることができます

ISet<My3ValueThing> dataset = new HashSet<My3ValueThing>();

データをに保持し、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);
于 2012-09-12T14:48:45.457 に答える
1

これがあなたの言っていることかどうかはわかりませんが、Tupleクラスを使用してみてください。

これは、異なるタイプの最大8つの値を保持できるジェネリッククラスです。

例えば:Tuple<Item, string, string>

于 2012-09-12T14:44:46.860 に答える
1

を使用して調べることができますTuple

Tuple<string, string, string> myTuple = new Tuple<string, string, string>();

あなたがこれに関して持っているかもしれない唯一の問題は、それらがそうであるようにユニークではないというDictionaryことです。

ここにMSDNドキュメント

于 2012-09-12T14:46:00.870 に答える
1

カスタムオブジェクトを作成し、値を入力します。インスタンスの配列を作成します。次に、辞書を配列へのハッシュとして使用します。(intがインスタンスのインデックスである辞書。)

正直なところ、この質問には非常に多くの警告があり、この質問に答えることはほとんど不可能です。達成しようとしていることについて、もう少し詳しく説明することを検討してください。

于 2012-09-12T14:48:59.323 に答える
1

また、クラスを作成してデータをモデル化し、任意のデータ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));
...
于 2012-09-12T14:49:54.020 に答える
0

2値のセットデータの場合、匿名クラス(便利な場合はよくあることですが)である2-Tuple( )のセット(HashSet<T>または、セット操作を実行する場合は、明らかな可能性がある別の実装)を使用します。特にlinqが関係している場合)または問題のデータのカスタムクラスです。ISet<T>Tuple<T1, T2>

辞書を使用するのは、1つのキーと1つの値のルックアップ用です。

3つの値のセットデータの場合、3タプル(Tuple<T1, T2, T3>)のセットと匿名クラス、または問題のデータのカスタムクラスを使用します。

2タプルのキー、1つの値のルックアップが必要な場合は、を使用し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;
    }
}
于 2012-09-12T14:51:20.470 に答える