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

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

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

Re[8]: LINQのWhere句の書き方


(過去ログ 51 を表示中)

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

■27832 / inTopicNo.1)  LINQのWhere句の書き方
  
□投稿者/ たこやき (41回)-(2008/11/15(Sat) 16:33:57)

分類:[C#] 

C#2008
たいへんお世話になってます。
2つの異質の配列 aa と bb があるとして、

Point[] aa = new Point[]{
new Point(11,111),
new Point(22,222),
new Point(33,333),
new Point(44,444),
new Point(55,555)};

int[] bb = { 22, 44 };

bbの値を持つものを aa から抽出したいのですが、
うまくいきません。
join式ではうまくいくのですが、その後編集ができないので、
申し訳ありませんがアドバイスお願いします。

エラー式
var cc =
from p in aa
where p.X == (from q in bb select q)
select p;





引用返信 編集キー/
■27833 / inTopicNo.2)  Re[1]: LINQのWhere句の書き方
□投稿者/ .SHO (46回)-(2008/11/15(Sat) 17:02:30)
No27832 (たこやき さん) に返信

いまひとつやりたい事がわかりませんがこれでいいのかな?
WriteLineのところの ap が抽出した場所です。

for ( int bp=0; bp<bb.Length; bp++ )
    for ( int ap=0; ap<aa.Length; ap++ )
        if ( bb[bp] == aa[ap].X )
            System.Console.WriteLine( ap );

引用返信 編集キー/
■27835 / inTopicNo.3)  Re[2]: LINQのWhere句の書き方
□投稿者/ たこやき (42回)-(2008/11/15(Sat) 17:20:57)
.SHOさん ご返信ありがとうございます。
値そのものを取り出すならそれでいいのですが、
DataSourceにセットするDataViewを作りたいので、
LINQ式で行いたいのです。説明不足ですみません。
引用返信 編集キー/
■27836 / inTopicNo.4)  Re[3]: LINQのWhere句の書き方
□投稿者/ .SHO (47回)-(2008/11/15(Sat) 17:52:12)
No27835 (たこやき さん) に返信

> LINQ式で行いたいのです。説明不足ですみません。

あっそうですね。失礼しました。
で、

var cc =
from p in aa
where p.X == bb[0] || p.X == bb[1]
select p;

じゃ、やっぱりダメですかね?^^;
引用返信 編集キー/
■27837 / inTopicNo.5)  Re[4]: LINQのWhere句の書き方
□投稿者/ たこやき (43回)-(2008/11/15(Sat) 19:14:44)
.SHOさん ご返信ありがとうございます。
> where p.X == bb[0] || p.X == bb[1]
2件限定ならいいのですが、
残念ながら不定数なので、すみません。
引用返信 編集キー/
■27840 / inTopicNo.6)  Re[5]: LINQのWhere句の書き方
□投稿者/ Hongliang (316回)-(2008/11/15(Sat) 19:58:45)
where Array.Exists(bb, x => x == p.X)
とか?
引用返信 編集キー/
■27842 / inTopicNo.7)  Re[6]: LINQのWhere句の書き方
□投稿者/ NyaRuRu (70回)-(2008/11/15(Sat) 21:44:41)
2008/11/15(Sat) 21:52:40 編集(投稿者)
No27840 (Hongliang さん) に返信
> where Array.Exists(bb, x => x == p.X)
> とか?

LINQ 書き方の問題と言うよりは,
値型配列の要素を列挙したらそれがコピーで困っている
という話のような気がします.
解決策としては,
配列要素そのものを列挙するのではなくインデックスを列挙するか,
各要素を参照型 (例えば StrongBox<T>) でラップしてしまうかですかねぇ.
とりあえず参照型でラップしてみた例です.
DataSource とか使ったことがないので,
これでご希望の条件に合っているのかよく分かりませんが.

StrongBox<Point>[] wrapped_aa = new StrongBox<Point>[]{
        new StrongBox<Point>(new Point(11,111)),
        new StrongBox<Point>(new Point(22,222)),
        new StrongBox<Point>(new Point(33,333)),
        new StrongBox<Point>(new Point(44,444)),
        new StrongBox<Point>(new Point(55,555))};

int[] bb = { 22, 44 };

// join を使ってもよい
var seq = from a in wrapped_aa
          from b in bb
          where a.Value.X == b
          select a;

foreach (var item in seq)
{
    item.Value.Y = 0;
}

foreach (var item in seq)
{
    Console.WriteLine(item.Value);
}

// 結果
// {X=22,Y=0}
// {X=44,Y=0}

引用返信 編集キー/
■27870 / inTopicNo.8)  Re[7]: LINQのWhere句の書き方
□投稿者/ まんごーぷりん (1回)-(2008/11/17(Mon) 09:30:22)
まんごーぷりん さんの Web サイト
あれ?
こーゆーことじゃなくて?

var q1 =
  from p1 in aa
    from p2 in bb
    where p1.X == p2
    select p1;

引用返信 編集キー/
■27882 / inTopicNo.9)  Re[8]: LINQのWhere句の書き方
□投稿者/ たこやき (45回)-(2008/11/17(Mon) 11:15:56)
Hongliangさん NyaRuRuさん 
ご返信ありがとうございます。
ド素人の僕には若干内容がむずかしかったので
じっくり勉強させてもらおうと、ご返事が遅くなりましたが、
まんごーぷりん さんが明確にお教え下さって、
問題は見事解決しました。
問題点をうまく表現できていなくて申し訳ありませんでした。

まんごーぷりんさん、本当にありがとうございました。
こんなに簡単に書けるとは、LINQってすごいですね。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -