X



C#, C♯, C#相談室 Part93©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 1e06-m8Mb)
垢版 |
2017/04/22(土) 08:52:00.93ID:iVvswOrb0
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part92
http://echo.2ch.net/test/read.cgi/tech/1485589613/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0599デフォルトの名無しさん (ワッチョイ 6db5-p+0f)
垢版 |
2018/07/15(日) 11:14:40.73ID:GMJtRfj30
サブスクリプションで全シリーズ揃えてる俺に死角無し。
0601デフォルトの名無しさん (ササクッテロル Spc7-Bhrm)
垢版 |
2018/08/02(木) 11:31:31.36ID:ijDqx/PBp
Entity Framework Coreについて質問です。

以下のように1対多の入れ子(left join)になったデータを取ってくる場合で、一番最下層のテーブルに取得条件を追加したいです。
どのようにしてwhereメソッドを書けばよいでしょうか。
.Include(x => x.Departments)
.ThenInclude(x => x.Groups)
.ThenInclude(x => x.SubGroups)
.ThenInclude(x => x.Employees)
.ThenInclude(x => x.Skills)

例えば以下のような感じです。
Skill.ExpireDate >= DateTime.Today

それぞれのプロパティはコレクションのため以下のようには書くことができません
Where(x => x.Departments.Groups.SubGroups.Employees.Skills.ExpireDate >= DateTime.Today)

ThenIncludeで指定しているプロパティがすべて列挙でなければ以下のように書けると思うのですが・・・
Where(x => x.Department.Group.SubGroup.Employee.Skill.ExpireDate >= DateTime.Today)

それぞれの階層のクラスは全プロパティ取得することを想定しています。
Entity Framework Coreで実現可能でしょうか。
0603デフォルトの名無しさん (ササクッテロル Spc7-Bhrm)
垢版 |
2018/08/02(木) 12:30:22.50ID:ijDqx/PBp
>>602
辿らない場合、スキルクラス単位で条件絞り込みができるのでしょうか?
これができればとても楽なのですが、、、
0605デフォルトの名無しさん (ササクッテロル Spc7-Bhrm)
垢版 |
2018/08/02(木) 15:11:34.29ID:ijDqx/PBp
いえ、辿りたいわけではなくて、辿らないとできないと勝手に思ってただけです
辿らなくて良いなら辿らないでやれればベストです。
ですがその方法がわからないので教えてもらえませんでしょうか。
0606デフォルトの名無しさん (ワッチョイ 8f9f-LI4B)
垢版 |
2018/08/02(木) 21:52:06.55ID:nmSSZypj0
var q = _context.Hoges.FromSql($@"
select H.* from Hoges H where exists (
select null from Departments D where H.DeptId = D.DeptId and exists (
select null from Groups G where D.DeptId = G.DeptId and exists (
select null from SubGroups SG where G.GrpId = SG.GrpId and exists (
select null from Employees E where SG.SGrpId = E.SGrpId and exists (
select null from Skills SK where E.EmpId = SK.EmpId and SK.ExpireDate >= {DateTime.Today}
)))))
");

var hoges = q.Include(x => x.Departments)
.ThenInclude(x => x.Groups)
.ThenInclude(x => x.SubGroups)
.ThenInclude(x => x.Employees)
.ThenInclude(x => x.Skills)
.ToList();
0610デフォルトの名無しさん (ワッチョイ ff58-0Uuo)
垢版 |
2018/08/07(火) 20:55:48.43ID:7nA6P5yg0
Linqでの書き方で質問なのですが
同じサイズのdataAとdataBのデータがあるとして
データが違う箇所のIndexを取り出すとしたらどう書けば良いでしょうか?
今は↓のようなコードになっています。

List<int> dataA = new List<int>() { 1, 2, 3, 4, 5, 6 };
List<int> dataB = new List<int>() { 1, 2, 4, 3, 5, 6 };
bool resultAB = dataA.SequenceEqual( dataB);

if(resultAB = false)
{
foreach(var A in dataA)
{

比較処理
}
}


結果
2
3
0611デフォルトの名無しさん (ワッチョイ b3e3-10BI)
垢版 |
2018/08/07(火) 21:22:20.14ID:UKw4EMmv0
>>610
ない頭絞って考えてみた。
Enumerable.Range(0, dataA.Count()).Where(p => dataA[p] != dataB[p]);
やら
dataA.Select((v, i) => new { value = v, index = i }).Where(p => p.value != dataB[p.index]).Select(p => p.index);

どっちも汚い。もっと賢いのおしえろください
0614611 (ワッチョイ b3e3-10BI)
垢版 |
2018/08/07(火) 21:35:47.39ID:UKw4EMmv0
無理矢理LINQつかってみたけど>>613に一票
0616デフォルトの名無しさん (ワッチョイ ff58-0Uuo)
垢版 |
2018/08/07(火) 21:41:47.05ID:7nA6P5yg0
dataAとdataBが1000件以上あるので、まず単純に変更してるのがあるか?で
SequenceEqualを使ってみた流れでLINQを調べていた流れで知りたかったです。
forで書くのがわかりやすいとは思うけど、LINQでもっとうまく書けるかなと思って

>>611参考になりました。ありがとうございます!
0618デフォルトの名無しさん (アウアウカー Sa07-kkiZ)
垢版 |
2018/08/07(火) 23:11:20.30ID:EHUuk9/6a
zip使えばいいんでね?
0619デフォルトの名無しさん (ワッチョイ 8f9f-I2NA)
垢版 |
2018/08/07(火) 23:26:49.96ID:WUtnzCvr0
Linqのほうがわかりやすいし、ソースがランダムアクセスできるとも限らんだろ

シーケンスを束ねてインデックス振って比較して違うやつだけ取り出してインデックスを取り出す
Linqなら思ったことをそのまま書けばいい

IEnumerable<int> Hoge<T>(IEnumerable<T> a, IEnumerable<T> b) {
var comp = Comparer<T>.Default;
return a.Zip(b, (x, y) => (x, y)) // シーケンスを束ねて
.Select((e, i) => (i, e.x, e.y)) // インデックス振って
.Where(e => comp.Compare(e.x, e.y) != 0) // 比較して違うやつだけ取り出して
.Select(e => e.i); // インデックスを取り出す
}

ループじゃぱっとみ何やってるかわかんねえよ
0621デフォルトの名無しさん (ワッチョイ cfe8-Xflc)
垢版 |
2018/08/07(火) 23:35:51.16ID:vAj7NHSO0
LINQってEntityFrameworkでしか用途なくねえ?
0624デフォルトの名無しさん (アウアウエー Sadf-Eypl)
垢版 |
2018/08/08(水) 00:39:26.55ID:cXv1v5r0a
>>619
うーん、普通にこっちのほうが分かりやすいと思うけどw
別にLINQ否定派じゃないよ
IEnumerable<int> GetIndices()
{
  List<int> dataA = new List<int>() { 1, 2, 3, 4, 5, 6 };
  List<int> dataB = new List<int>() { 1, 2, 4, 3, 5, 6 };
  for (int i = 0; i < dataA.Count; i++)
    if (dataA[i] != dataB[i]) yield return i;
}
0625デフォルトの名無しさん (ワッチョイ 338a-Xflc)
垢版 |
2018/08/08(水) 03:30:51.92ID:x4iNladl0
Zipしたものをforeachで回すのが一番自然
IEnumerable<int> Hoge(IEnumerable<int> A, IEnumerable<int> B)
{
  var i = 0;
  foreach (var eq in A.Zip(B, (a, b) => a == b))
  {
    if (!eq) yield return i;
    i++;
  }
}

自分はやらんけどLinqならこう
dataA.Zip(dataB, (a, b) => a == b).Select((eq, i) => eq ? -1 : i).Where(i => i >= 0);
0627デフォルトの名無しさん (スップ Sd1f-Bh6x)
垢版 |
2018/08/08(水) 13:38:09.59ID:CtU8HUVGd
インデックスが必要な時、わざわざselect挟んでインデックス貼るの馬鹿らしい感じがして好きになれないんだけど仕方ないよね?
そんなにインデックスを参照することが多いなら生成時に一緒に貼っとけって話かもしれんが…
そもそもlinqマスターはインデックスを必要としない設計にいつもなるの?
自分もインデックスが無くて済むように考えるけど結果的に必要になる箇所が細部で出てくるんだよね
0628デフォルトの名無しさん (スプッッ Sd1f-hmJy)
垢版 |
2018/08/08(水) 14:08:00.53ID:csO2M6exd
どうしても必要な時はselect((value, index) => new {V = value, I = index})でインデックス引っ張ってるわ
それでもインデックス欲しい条件1行で書けるのが楽だからLinq便利派だけども
0629デフォルトの名無しさん (スップ Sd1f-Bh6x)
垢版 |
2018/08/08(水) 14:25:20.52ID:CtU8HUVGd
>>628
俺もそれ、ちょくちょくするんだけどforで回したほうがよくね?って思っちゃうことがあるんだよね
もちろん処理によりけりと言ってしまえばそれまでなんだけど
比較するようなもんじゃないかもしれんがjavascriptなんかだと大抵インデックス取れるから、そっち触ったあとにC#に戻ると処理考えるときにインデックスありきで考えがちになっちゃう気がしてる
0630デフォルトの名無しさん (スップ Sd1f-Bh6x)
垢版 |
2018/08/08(水) 14:32:55.42ID:CtU8HUVGd
先に出てた課題でもzipしたあと、そのままlinqで処理を完結させるか、zip後にforで回すか
個人的にはzipがどちらにせよ入るなら最後までlinqの方が1つの処理を1つの手法で解決してる感じがして好き
だけどインデックスが処理に必要だからfor使いたいって気持ちもわかる
0632デフォルトの名無しさん (ワッチョイ 338a-Xflc)
垢版 |
2018/08/08(水) 15:07:53.10ID:x4iNladl0
こういう拡張メソッド作っておくのはたまにやる
public static IEnumerable<int> WhereIndex<T>(this IEnumerable<T> self, Func<T, bool> predicate)
{
  var i = 0;
  foreach(var s in self)
  {
    if(predicate(s)) yield return i;
    i++;
  }
}

dataA.Zip(dataB, (a, b) => a == b).WhereIndex(eq => !eq);

拡張メソッド嫌いな人もいるだろうけど一番読みやすい
わざわざSelectでインデックスつけてる冗長さもないし、添字アクセスもないし、使う時はすっきり意味がわかりやすい
0633デフォルトの名無しさん (ブーイモ MMa7-A/YO)
垢版 |
2018/08/08(水) 16:44:49.34ID:Gn4Y43YUM
>>632
正直クソ分かりにくい
俺がレビューしたらリジェクトするわ
WhereIndexというメソッド名を見たら大抵の人はインデックスをフィルタ条件にして要素の値を返すメソッドと誤解する
そもそもメソッド名以前に、LINQって普通はキーやインデックスではなく要素の値を操作していくものっていう暗黙的了解があるから、
キーやインデックスの方を返すような操作については特に念入りにそれがわかるような明示的な表記になるように工夫したほうがいい
0639デフォルトの名無しさん (ワッチョイ 338a-Xflc)
垢版 |
2018/08/08(水) 18:27:19.45ID:x4iNladl0
>>633
>WhereIndexというメソッド名を見たら大抵の人はインデックスをフィルタ条件にして要素の値を返すメソッドと誤解する

そんなのはWhereでできるし

>LINQって普通はキーやインデックスではなく要素の値を操作していくものっていう暗黙的了解があるから、
>キーやインデックスの方を返すような操作については

それもSelectでできるし
だいたい要素の値を操作していくものっていう暗黙的了解があるならWhereIndexも要素の値が対象と思うんじゃない?
なんか矛盾してね?
0644デフォルトの名無しさん (ワッチョイ de81-8ulZ)
垢版 |
2018/08/11(土) 00:11:00.13ID:p6HuaRWz0
>>643
それってインデックスつけることが一つの目的じゃない?
インデックスってかソートかな?
いろんなところでいろんな処理されるコレクションがあって、その処理の殆どにインデックスが不要だけどごく一部にインデックスがほしいとき、わざわざ1行追加するのスッキリしないなぁって感じ

たった1行なんだから書きゃいいんすよ?
それはわかってるけどなんか気持ち悪いなぁって気がするだけ
0645デフォルトの名無しさん (ワッチョイ 4e9f-+CD1)
垢版 |
2018/08/11(土) 12:41:19.45ID:YyI+aygL0
ほとんど必要が無いインデックスだけど
ごく稀に必要になるから必要になるところでだけインデックスを追加するんだろ
ほとんど使わないインデックスのためにずっとランダムアクセス性を維持するとか無駄じゃん
0647デフォルトの名無しさん (ワッチョイ de81-8ulZ)
垢版 |
2018/08/11(土) 14:23:04.22ID:p6HuaRWz0
>>645
いや、linqでインデックスを付与しないけどランダムアクセスすることはあるよ?
前提変えたらそら意味通らんよ
コレクションをlinq以外で処理しちゃ駄目ルールでもあるの?
0648デフォルトの名無しさん (ワッチョイ 4e9f-+CD1)
垢版 |
2018/08/11(土) 14:36:01.31ID:YyI+aygL0
>>647
なにいってんだ?
IEnumerable<T>にインデックスなんてない
ないからSelectで付与するんでしょ

そんなルールはないけどほとんどほとんどLinqで済むでしょ?
Linqでサクサク処理してるのに中に突然ループが紛れ込んできたらキモいって話をしてる

var tmp = list.Where(...).OrderBy(...).ToArray();

for (int i = 0; ...) {
...
}

var result = tmp.Where(...).Select(...);
0649デフォルトの名無しさん (ワッチョイ de81-8ulZ)
垢版 |
2018/08/11(土) 14:48:08.19ID:p6HuaRWz0
>>648
え?ずっとそういう話をしてたのになんで突然
>ほとんど使わないインデックスのためにずっとランダムアクセス性を維持するとか無駄じゃん
って書いたの?

インデックスのないlinq処理でそれが必要になったときわざわざselectで付与するのなんか気持ち悪いねーって話よ?
0650デフォルトの名無しさん (ワッチョイ 4e9f-+CD1)
垢版 |
2018/08/11(土) 14:59:36.83ID:YyI+aygL0
>>649
気持ち悪いのはお前の感覚ではという話だろ
俺からすればToArrayやToListをかましてメモリとCPUを無駄にしたり余計なメソッドを追加するほうが嫌
メソッド化に関しては再利用性が高いかうまく抽象化されていて可読性が高まるというなら別だが
真にランダムアクセス性が必要なアルゴリズムならば変換せざるを得ないがそもそも今回の問題には必要がない
0651デフォルトの名無しさん (ワッチョイ de81-8ulZ)
垢版 |
2018/08/11(土) 15:12:53.25ID:p6HuaRWz0
>>650
うん、そうだよ
個人的に気持ち悪いなーってだけ
はじめからそういうふうにしか話ししてないつもりだけど

ランダムアクセスが不要だからあえてランダムアクセスできないコレクションを選択するの?
ランダムアクセスは不要だけどあったって使わないだけだからどっちでもいい、ってなるのが普通じゃないの?
パフォーマンス要求がシビアでランダムアクセスできるコレクションを選択することで、その要求から外れてしまう、とかいうならわかるけど
0652デフォルトの名無しさん (ワッチョイ 4e9f-+CD1)
垢版 |
2018/08/11(土) 15:28:37.80ID:YyI+aygL0
>>651
ランダムアクセスが不要なアルゴリズムなら「当然」IEnumerable<T>(ランダムアクセスできないコレクション)を選択するだろう
まったくもって「あえて」と言う理由が分からん
もしもSelectやWhereの引数が配列だったら普通のプログラマなら「あえて配列にしたのはなぜか」と疑問を持つだろう
なんか逆なんだよね思考パターンが
0654デフォルトの名無しさん (ササクッテロラ Sp03-bBK3)
垢版 |
2018/08/12(日) 00:56:37.14ID:UOoEXFjMp
コレクションって言葉がダメだと思うぞ?
そもそもIEnumerableはシーケンシャルな列挙の機能しか提供しない
根本的に理解が間違ってる
0660デフォルトの名無しさん (ワッチョイ b759-EyNT)
垢版 |
2018/09/13(木) 22:10:23.24ID:IOzhaO6j0
doxygenみたいなドキュメント生成ツールを使うとxaml部分がまともに解析出来ません。
bindingしているviewとviewmodelの関係なんかが分かるドキュメントにしたいんですが何か良い方法ないでしょうか?
0661デフォルトの名無しさん (ワッチョイ 57d2-NCQU)
垢版 |
2018/09/14(金) 22:17:10.47ID:BClpbb6X0
Func<string> func = () => { return "text"; };
var res = func();

これを一文で書くことはできますか。

ふと気になっただけではあるけれど、自分で解決できなくて気になって仕方がない。
基本的なことが分かってないような気がする。
0664デフォルトの名無しさん (ワッチョイ ffe8-okpm)
垢版 |
2018/09/15(土) 00:21:48.95ID:elLmwu/20
本当はなにをしたかったんだろう
例題が悪い気がする
0665661 (ワッチョイ 57d2-NCQU)
垢版 |
2018/09/15(土) 00:41:48.54ID:LMkhUY/p0
ああ、そうか。w

パラメータに対してちょっと複雑な変換を掛けるのだけど、汎用性がないから専用関数作るのもなんだし、
だったらラムダ式で書けばいいんじゃね?→ ラムダ式は Func 型?だから戻り値とれねーじゃん ってところから進めなった。
他にやり方はあるので出来なくてもいいのだけど、気にはなって。
0667デフォルトの名無しさん (ワッチョイ ff81-meyQ)
垢版 |
2018/09/15(土) 05:59:42.97ID:crViL/AR0
>>665
参照渡すとか?
0668デフォルトの名無しさん (アウアウエー Sadf-v8l+)
垢版 |
2018/09/15(土) 15:15:22.99ID:aC3C7hdpa
こんなのは嬉しくないね
var pi =
  (
    (Func<double>)
    (      
      () =>
      {
        const int total = 1000000;
        var inside = 0;
        var rnd = new Random();
        for (int i = 0; i < total; i++)
        {
          var x = rnd.NextDouble() * 2 - 1; var y = rnd.NextDouble() * 2 - 1;
          if (x * x + y * y < 1) inside++;
        }
        return 4.0 * inside / total;
      }
    )
  )();
0669デフォルトの名無しさん (アウアウエー Sadf-v8l+)
垢版 |
2018/09/15(土) 15:22:04.34ID:aC3C7hdpa
これも却下だな
Func<Func<double>, double> invoke = (f) => f();
var pi = invoke
  (
    () =>
    {
      const int total = 1000000;
      var inside = 0;
      var rnd = new Random();
      for (int i = 0; i < total; i++)
      {
        var x = rnd.NextDouble() * 2 - 1; var y = rnd.NextDouble() * 2 - 1;
        if (x * x + y * y < 1) inside++;
      }
      return 4.0 * inside / total;
    }
  );
0672デフォルトの名無しさん (ワッチョイ d79a-KGwk)
垢版 |
2018/09/15(土) 18:34:42.22ID:nwnNkRfe0
docsにもあるけど
https://docs.microsoft.com/ja-jp/dotnet/api/system.random?redirectedfrom=MSDN&;view=netframework-4.7.2
dobonの方が分かりやすいし読みやすいから
https://dobon.net/vb/dotnet/programing/random.html の
//0.0以上1.0未満の乱数を倍精度浮動小数点数で返す
Double d = r.NextDouble();
>>670こういう意味とは違うの?
整数範囲で出して割った方が範囲や有効桁も決められるからそっちの方がよさそうな気もする
0673デフォルトの名無しさん (アウアウエー Sadf-v8l+)
垢版 |
2018/09/15(土) 18:56:24.76ID:aC3C7hdpa
[0, 1]とか(0, 1)は数学の記号ね(多分高校1年ぐらいで習ってるはずw)

Random.DoubleNextの戻り値は[0, 1)(つまり0≦x<1)らしい
普段乱数使うようなコード書いてないからよく分からんけど、
0≦x≦1とか0<x<1でないと困る場面も多いんじゃないかなと思っただけ
0677デフォルトの名無しさん (ワッチョイ 9fb3-0AE+)
垢版 |
2018/09/15(土) 20:30:38.93ID:OUVvcRON0
>>665
> パラメータに対してちょっと複雑な変換を掛けるのだけど
と言うなら例もパラメーター使ってる例を書かなきゃ

>>668
俺もこれしか思いつかなかった
そもそも
var f = (string x) => { return "abc" + x; };
位は型推論してくれてもいいと思うんだけど難しいのかな?
0679デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/15(土) 20:42:09.91ID:KIanXBkQ0
面倒だったら擬似乱数生成器を自分で作ればいい
キミラ程度が使う程度の擬似乱数だったら数行コピペでできる程度のもんで十分だからな
0681デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/15(土) 20:53:08.93ID:KIanXBkQ0
https://ideone.com/PJDFVv

この程度で十分
0684デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/15(土) 21:37:43.29ID:KIanXBkQ0
やっぱり低学歴知恵遅れは
内側の擬似乱数生成器をかえるだけの話なのがわかってないわ

きっと擬似乱数がなんなのかすらわかってないわ
擬似乱数がなんなのかわからずに乱数()とかいって数字使ってる程度だからな
0685デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/15(土) 21:39:33.01ID:KIanXBkQ0
つまり
コレがC#なんか使ってるヤツラのオツムの程度
0686デフォルトの名無しさん (ワッチョイ b7e3-TNGn)
垢版 |
2018/09/15(土) 21:40:44.62ID:qw6mr0Vb0
>>673
(0,1)は[0,1)が0ならやりなおし、でいいんじゃないのと単純に思ったがそんなものじゃない?
0687デフォルトの名無しさん (ワッチョイ 9780-9b2l)
垢版 |
2018/09/15(土) 22:05:16.77ID:KIanXBkQ0
そもそも機械イプシロンのこと分かってて
ああいうレスしてるようにはまったく見えないからな
0689661 (ワッチョイ 57d2-NCQU)
垢版 |
2018/09/15(土) 23:10:36.43ID:LMkhUY/p0
気に掛けてくれた方々に。ありがとう。

>>668
ああ。なるほど。型を明示してあげたらよかったのか。
キャストを加えたら期待通りに書くことが出来ました。ありがとうございます。

これってラムダ式を var で宣言した変数に代入できなかったことがヒントになり得たんだな。頭が回ってなかった。
これくらいは型推論してくれても良さそうなのにとは原因が分かった後での負け惜しみ。

>>666,680
今回のはそういうことが出来そうなのに出来なくて悶々としてしまって。
実用性度外視で原因を知りたかったの。
0690デフォルトの名無しさん (ワッチョイ d7c4-8zjY)
垢版 |
2018/09/16(日) 10:09:07.69ID:QiF2mi6W0
今ならref/outがないならAction/Funcに型推論して
シグネチャが同じdelegate間の暗黙の型変換が行われる
初期化時に左辺とかキャストとかでdelegate型が明示されてたらそのdelegate型でnewされる
でいいと思うよな〜
0697デフォルトの名無しさん (ワッチョイ c1d2-C4Ur)
垢版 |
2018/09/26(水) 21:52:32.99ID:rAzbq+Jy0
下みたいなことって出来ます?
やりたいのは object 型の変数に代入したジェネリック系のインスタンスを、さらに元のジェネリックの型にキャストし直すってことなんですが。

void func( object dic )
{
var tmp = (Dictionary)dic;  // ← これみたいなことをやる方法がないかなと
tmp.Add( "test", new object() );
}

var dic = new Dictionary< string, object >();
func( dic );
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況