C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 数列の変換


(過去ログ 137 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■80469 / inTopicNo.1)  数列の変換
  
□投稿者/ masa (6回)-(2016/07/20(Wed) 10:50:52)

分類:[C#] 

var data = new int[]{1,2,3,4,5};
dataの各要素を加算し、int[]{1,3,6,10,15}という数列に変換したいのです。


data.sum()では合計は出せますが、その過程が残りません。
LINQの範囲変数では、要素の加算ができませんでした。


下記のような方法以外に、良い方法があれば、ご享受下さい

var data = int[]{1,3,6,10,15};
var s = new List<int>();
var tmp =0;
foreach (var e in data a)
{
tmp +=e;
s.Add(t);
}


引用返信 編集キー/
■80470 / inTopicNo.2)  Re[1]: 数列の変換
□投稿者/ masa (7回)-(2016/07/20(Wed) 10:55:27)
LINQを用いて遅延実行させることを希望しています。

> 下記のような方法以外に、良い方法があれば、ご享受下さい
>
> var data = int[]{1,3,6,10,15};
> var s = new List<int>();
> var tmp =0;
> foreach (var e in data a)
> {
> tmp +=e;
> s.Add(t);
> }
>
>
引用返信 編集キー/
■80471 / inTopicNo.3)  Re[1]: 数列の変換
□投稿者/ 魔界の仮面弁士 (776回)-(2016/07/20(Wed) 11:30:29)
No80469 (masa さん) に返信
> var data = new int[]{1,2,3,4,5};
> var data = int[]{1,3,6,10,15};

質問文のコードとサンプルコードで食い違いがあるようで。
(元データではなく結果データになっている上に、そもそも文法エラー)


> 下記のような方法以外

// 案1
var result1 = new List<int>();
data.Aggregate(0, (sum, value) => { result1.Add(sum += value); return sum; });

// 案2
var result2 = data.Select((value, i) => data.Take(i + 1).Sum());
引用返信 編集キー/
■80474 / inTopicNo.4)  Re[2]: 数列の変換
□投稿者/ 魔界の仮面弁士 (779回)-(2016/07/20(Wed) 11:39:59)
No80470 (masa さん) に返信
> LINQを用いて遅延実行させることを希望しています。

foreach で回す実装はそのままに、yield return する拡張メソッドとして用意すれば、
「LINQを用いて遅延実行」という要件を満たせるかと思います。

// 案3
var result3 = data.Accumulate();

public static IEnumerable<T> Accumulate<T>(this IEnumerable<T> data)
{
  T v = default(T);
  foreach (dynamic item in data) yield return (v += item);
}
引用返信 編集キー/
■80475 / inTopicNo.5)  Re[3]: 数列の変換
□投稿者/ masa (9回)-(2016/07/20(Wed) 12:32:02)
ありがとう御座います。
これを機会として、拡張メソッドを使いこなせるようにしたいと思います。
他の事例も、参考になりました。

> 「LINQを用いて遅延実行」という要件を満たせるかと思います。
>
> // 案3

解決済み
引用返信 編集キー/
■80476 / inTopicNo.6)  Re[3]: 数列の変換
□投稿者/ shu (893回)-(2016/07/20(Wed) 12:43:38)
2016/07/20(Wed) 13:03:05 編集(投稿者)
無理やりですが
こんなのはどうでしょうか?
eだとイベント引数と被るのでelに変更
先頭データであるか判断する為Enumerable.Randeで配列のインデックスに
よるLINQループ(この表現が合っているかは分かりません)
qryが何度評価されてもよいように先頭データのときはsをelにして
それ以降は足し算をして合計値を設定するようにしています。


    var data = new int[] { 1, 2, 3, 4, 5 };
    var s=0;
    var qry = (from i in Enumerable.Range(0, data.Length)
               let el = data[i]
               select s = (i==0 ? el :  s + el));

    foreach (var el in qry)
    {
        Console.WriteLine(el);
    }

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -