2

List<string>異なる種類のデータを含む同じ長さの3 つの異なるがあります。例えば:

List<string> dates = new List<string>() { "20120301", "20120401", "20120501", "20120601", "20120701"};
List<string> times = new List<string>() { "0500", "0800", "0100", "1800", "2100" };
List<string> quantities = new List<string>() { "1", "2", "1", "3", "1" };

実際のデータは何でもかまいませんが、リストの長さは常に同じです。それらを1つにマージしたいList<DTQ>

public struct DTQ
{
    DateTime dt;
    double q;
    public DTQ(DateTime dt, double q) { this.dt = dt; this.q = q; }
}

ラムダ関数でこれを行う方法はありますか? これまでのところ、データがsstringsではなく3 つの場合にデータをマップする方法を説明するラムダ関数を作成できました。List<string>

Func<string, string, string, DTQ> mergeFields = (d, t, q)
            => new DTQ(DateTime.ParseExact(string.Format("{0}{1}", d, t), "yyyyMMddhhmm", CultureInfo.InvariantCulture), double.Parse(q));

しかし、そこからどこに行けるかわかりません。アイデアは、この関数をリストのすべてのインデックスに適用することです。

4

2 に答える 2

3

の仕事のように見えZipますが、リストが 2 つではなく 3 つある点が異なります。

の現在の定義を使用するとmergeFields、次のようなことができます。

var dateAndTimes = dates.Zip(times, (d, t) => new { Date = d, Time = t });
var all = dateAndTimes.Zip(quantities, (dt, q) => new { dt.Date, dt.Time, Quantity = q });
var result = all.Select(x => mergeFields(x.Date, x.Time, x.Quantity)).ToList();

より一般的なソリューションが必要な場合は、Zip3 つのコレクションを使用するオーバーロードを作成することもできます。

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult>(
    this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    IEnumerable<TThird> third,
    Func<TFirst, TSecond, TThird, TResult> resultSelector)
{
    return first.Zip(second, (f, s) => new { f, s })
                .Zip(third, (fs, t) => resultSelector(fs.f, fs.s, t));
}

(あるいは、おそらくもう少し速い Romoku の実装を使用することもできます)

そして、次のように使用します。

var result = dates.Zip(times, quantities, mergeFields).ToList();
于 2013-04-09T17:52:06.337 に答える