40

時々、タプルを使用する必要があります。たとえば、タンクとそのターゲットタンクのリストがあります (それらを追跡するか、そのようなものです):

List<Tuple<Tank,Tank>> mylist = new List<Tuple<Tank,Tank>>();

そして、リストを反復処理するときに、それらにアクセスします

mylist[i].item1 ...
mylist[i].item2 ...

非常に紛らわしく、次の方法でアクセスできる場合、item1 と item2 を常に忘れてしまいます。

mylist[i].AttackingTank...
mylist[i].TargetTank...

クラスを定義せずにそれを行う方法はありますか?

MyTuple
{
public Tank AttackingTank;
public Tank TargetTank;
}

このクラスの定義を避けたいのは、さまざまなシナリオでさまざまなクラスを定義する必要があるためです。「トリック」を実行して、これを匿名にすることはできますか。

何かのようなもの :

var k = new {Name = "me", phone = 123};
mylist.Add(k);

もちろん、リストを定義するときにリストに渡すタイプがないという問題

4

9 に答える 9

18

を使用できますList<dynamic>

 var myList = new List<dynamic>();
 myList.Add(new {Tank = new Tank(), AttackingTank = new Tank()});

 Console.WriteLine("AttackingTank: {0}", myList[0].AttackingTank);
于 2013-04-01T18:41:33.340 に答える
8

ここにハックがあります:

var myList = Enumerable.Empty<int>()
    .Select(dummy => new { AttackingTank = default(Tank), TargetTank = default(Tank), })
    .ToList();

Tankがクラス型の場合、(Tank)nullの代わりに書くことができますdefault(Tank)Tankたまたま手元にあるインスタンスを使用することもできます。


編集:

または:

var myList = Enumerable.Repeat(
    new { AttackingTank = default(Tank), TargetTank = default(Tank), },
    0).ToList();

ジェネリック メソッドを作成すると、 を使用する必要がなくなりますEnumerable.Empty。次のようになります。

static List<TAnon> GetEmptyListWithAnonType<TAnon>(TAnon dummyParameter)
{
    return new List<TAnon>();
}

TAnonもちろん、次のように、使用法から推測して呼び出す必要があります。

var myList = GetEmptyListWithAnonType(new { AttackingTank = default(Tank), TargetTank = default(Tank), });
于 2013-04-01T19:05:38.317 に答える
8

最後に、そのような構文を使用する可能性があることに注意してください。C# 7.0 で導入されました。

var tanks = new List<(Tank AttackingTank, Tank TargetTank)>();

(Tank, Tank) tTank = (new Tank(), new Tank());
tanks.Add(tTank);

var a = tanks[0].AttackingTank;
var b = tanks[0].TargetTank;
于 2017-11-08T13:00:07.847 に答える
5

paramsを受け取り、それを返す汎用メソッドを作成できます。

public static IList<T> ToAnonymousList<T>(params T[] items)
{
  return items;
}

だから今、あなたは言うことができます:

var list=ToAnonymousList
(
  new{A=1, B=2},
  new{A=2, B=2}
);
于 2015-06-09T15:58:13.203 に答える
1

またはさらに単純な

        var tupleList = (
           new[] {
                new { fruit = "Tomato", colour = "red"},
                new { fruit = "Tomato", colour = "yellow"},
                new { fruit = "Apple", colour = "red"},
                new { fruit = "Apple", colour = "green"},
                new { fruit = "Medlar", colour = "russet"}
            }).ToList();

これは静的機能を失います。

于 2016-04-20T08:41:56.437 に答える
1

ここでもう 1 つ便利なビットを追加します。私は時々アレックスの答えを使用しますが、それが明らかではないため、必要なときにそれを追跡しようとするのは少し気が狂います(「新しい{」を検索していることに気づきます)。

そこで、次の小さな静的メソッドを追加しました (拡張メソッドにできたらいいのにと思いますが、どのような型ですか?):

public static List<T> CreateEmptyListOf<T>(Func<T> itemCreator)
{
    return Enumerable
        .Empty<object>()
        .Select(o => itemCreator())
        .ToList();
}

これにより、このパターンが必要になるたびに異なる部分が同じ部分から分離されます。私はそれを次のように呼びます:

var emptyList = Ext.CreateEmptyListOf(() => new { Name = default(string), SomeInt = default(int) });
于 2016-06-21T14:45:27.283 に答える