RSS

カテゴリー別アーカイブ: C#

Yield と IEnumerable, IEnumerator

C#では yield return 文を使うと foreach 文の in 句に指定可能なレンジオブジェクトを作れます。Visual Basicでも Yield 文を使って同様のことができます。

C#では、IEnumerable インタフェースを実装したクラスのインスタンスが、in 句に指定可能なレンジオブジェクトになります。一方、Visual Basic では Iterator Function という関数がその代わりになります。この関数はIEnumerable(Of )を返す必要があります。

下のサンプルはC#で yield return を使うものですが、レンジオブジェクトになるクラス MyRange は IEnumerable を実装しています。IEnumerable は IEnumerator を返す GetEnumerator() メソッドを実装しなければなりません。このメソッドの中で、yield return を使って foreach 文で使われる項目を列挙します。

using System;
using System.Collections;

namespace Yield
{
  class MyRange : IEnumerable
  {
     object[] data;

     public MyRange()
     {
        data = new object[] { 100, "abc", -0.5, 0 };
     }
     public IEnumerator GetEnumerator()
     {
       int i = 0;
       while (i < data.Length)
       {
           i++;
           yield return data[i - 1];
       }
     }
  }
  class Program
  {
     static void Main(string[] args)
     {
        foreach (var x in new MyRange())
        {
            Console.WriteLine(x);
        }
#if DEBUG
        Console.ReadKey();
#endif
     }
   }
}

下のサンプルは Yield 文を使う Visual Basic の例です。C#ではIEnumerableインタフェースを実装したクラスを作成する必要がありましたが、Visual Basic では Iterator Function という関数を定義するだけです。
この関数は IEnumerable(Of ) 型を返し、その関数値は Yield文で列挙します。

' Yieldのテスト (Visual Basic)
Module Module1
Sub Main()
 For Each i In MyRange()
   Console.WriteLine(i)
 Next
 #If DEBUG Then
   Console.ReadKey()
 #End If
End Sub

Iterator Function MyRange() As IEnumerable(Of Integer)
   For i = 1 To 20 Step 3
     Yield i
   Next
End Function
End Module
広告
 
コメントする

投稿者: : 2012/11/30 投稿先 C#, VB

 

FileSelector UserControl

using System;
 using System.Windows.Forms;
namespace UserControlLibrary
 {
 ///

 

/// ファイル・フォルダセレクタ コントロール ///

 

public partial class FileSelectorControl : UserControl
 {
    public FileSelectorControl()
    {
       InitializeComponent();
    }
///

 

/// 表示されるタイトル ///

 

public string Title
{
  get
  {
     return label1.Text;
  }
  set
  {
     label1.Text = value;
  }
 }
///

 

/// コントロールがロードされたとき ///

 

///
 ///
 private void FileSelectorControl_Load(object sender, EventArgs e)
 {
   DialogType = 0;
   Path = "";
   Extension = "";
   Filter = "";
   InitialDirectory = "";
 }
///

 

/// ボタンがクリックされたとき表示するダイアログのタイプ /// 0: OpenFileDialog /// 1: SaveFileDialog /// 2: FolderBrowserDialog ///

 

public int DialogType
 {
   get;
   set;
 }
///

 

/// パス名 ///

 

public string Path
 {
   get
   {
     return textBox1.Text;
   }
   set
   {
     textBox1.Text = value;
   }
 }
///

 

/// OpenFileDialog / SaveFileDialog のFilter ///

 

public string Filter
 {
   get;
   set;
 }
///

 

/// OpenFileDialog / SaveFileDialog のExtension ///

 

public string Extension
 {
 get;
 set;
 }
///

 

/// OpenFileDialog / SaveFileDialog のInitialDirectory ///

 

public string InitialDirectory
 {
 get;
 set;
 }
///

 

/// ボタンがクリックされたとき ///

 

///
 ///
 private void button1_Click(object sender, EventArgs e)
 {
 switch (DialogType)
 {
 case 1: // SaveFileDialog
 saveFileDialog1.FileName = Path;
 saveFileDialog1.InitialDirectory = InitialDirectory;
 saveFileDialog1.Filter = Filter;
 saveFileDialog1.DefaultExt = Extension;
 if (saveFileDialog1.ShowDialog() == DialogResult.OK)
 {
 textBox1.Text = saveFileDialog1.FileName;
 }
 break;
case 2: // FolderBrowserDialog
 if (Path == "")
 {
 folderBrowserDialog1.SelectedPath = InitialDirectory;
 }
 else
 {
 folderBrowserDialog1.SelectedPath = Path;
 }
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
 {
 textBox1.Text = folderBrowserDialog1.SelectedPath;
 }
 break;
default: // OpenFileDialog
 openFileDialog1.FileName = Path;
 openFileDialog1.InitialDirectory = InitialDirectory;
 openFileDialog1.Filter = Filter;
 openFileDialog1.DefaultExt = Extension;
 if (openFileDialog1.ShowDialog() == DialogResult.OK)
 {
 textBox1.Text = openFileDialog1.FileName;
 }
 break;
 }
 }
///

 

/// ドラッグ開始 ///

 

///
 ///
 private void FileSelectorControl_DragEnter(object sender, DragEventArgs e)
 {
 if (e.Data.GetDataPresent(DataFormats.FileDrop))
 {
 e.Effect = DragDropEffects.Copy;
 }
 }
///

 

/// ドラッグ中 ///

 

///
 ///
 private void FileSelectorControl_DragOver(object sender, DragEventArgs e)
 {
 if (e.Data.GetDataPresent(DataFormats.FileDrop))
 {
 e.Effect = DragDropEffects.Copy;
 }
 }
///

 

/// ドロップ ///

 

///
 ///
 private void FileSelectorControl_DragDrop(object sender, DragEventArgs e)
 {
 if (e.Data.GetDataPresent(DataFormats.FileDrop))
 {
 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
 textBox1.Text = files[0];
 }
 }
 }
 }
 
コメントする

投稿者: : 2011/12/21 投稿先 C#

 

タグ: ,

EditText UserControl

using System.Windows.Forms;

namespace UserControlLibrary
{
///

/// ラベル付きテキストボックス
///

 

public partial class EditText : UserControl
{
public EditText()
{
InitializeComponent();
}

///

/// テキストボックスの値
///

 

public string TextValue
{
get
{
return textBox1.Text;
}

set
{
textBox1.Text = value;
}
}

///

/// ラベルの値
///

 

public string LabelValue
{
get
{
return label1.Text;
}

set
{
label1.Text = value;
}
}

///

/// エラー表示 (getは常に””を返す)
///

 

public string Error
{
get
{
return “”;
}

set
{
errorProvider1.SetError(textBox1, value);
}
}

///

/// テキストボックスの左端からの位置
///

 

public int MarginText
{
get
{
return textBox1.Left;
}

set
{
textBox1.Left = value;
}
}

///

/// エラーをクリアする。
///

 

public void ClearError()
{
errorProvider1.Clear();
}

}
}

 
コメントする

投稿者: : 2011/12/21 投稿先 C#

 

タグ: ,

OKCancelボタン UserControl

using System;
using System.Windows.Forms;

namespace UserControlLibrary
{
///

/// OK / Cancelボタン
///

 

public partial class OKCancel : UserControl
{
public enum Buttons { OK, CANCEL };
public delegate void OKCancelDelegate(Buttons sender);
public event OKCancelDelegate ButtonClick = null;

public OKCancel()
{
InitializeComponent();
}

///

/// OKボタンの文字列
///

 

public string OKText
{
get
{
return btnOK.Text;

}

set
{
btnOK.Text = value;
}
}

///

/// Cancelボタンの文字列
///

 

public string CancelText
{
get
{
return btnCancel.Text;
}

set
{
btnCancel.Text = value;
}
}

///

/// OKボタンがクリックされたとき
///

 

///
///
private void btnOK_Click(object sender, EventArgs e)
{
if (ButtonClick != null)
{
ButtonClick(Buttons.OK);
}
}

///

/// Cancelボタンがクリックされたとき
///

 

///
///
private void btnCancel_Click(object sender, EventArgs e)
{
if (ButtonClick != null)
{
ButtonClick(Buttons.CANCEL);
}
}
}
}

 
コメントする

投稿者: : 2011/12/21 投稿先 C#

 

タグ: ,

HttpWebRequestとHttpWebClient

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using MySettings = global::WebClient.Properties.Settings;

namespace WebClient
{
 public partial class Form1 : Form
 {
 delegate void SetTextCallback(string text);
 HttpWebRequest request = null;

 /// <summary>
 /// コンストラクタ
 /// </summary>
 public Form1()
 {
 InitializeComponent();
 }

 /// <summary>
 /// Enterが押されたとき
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
 {
 if (e.KeyChar == '\r')
 {
 if (MessageBox.Show(textBox1.Text + "へ要求を送信してよいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
 {
 MySettings.Default.LastInput = textBox1.Text;
 MySettings.Default.Save();
 this.Request();
 }
 }
 }

 /// <summary>
 /// ウェブサーバへ要求を送信する。
 /// </summary>
 private void Request()
 {
 object state = new object();
 this.request = HttpWebRequest.Create(textBox1.Text) as HttpWebRequest;
 IAsyncResult response = request.BeginGetResponse(
 delegate(IAsyncResult ar)
 {
 try
 {
 WebResponse wres = request.EndGetResponse(ar);
 Stream stream = wres.GetResponseStream();
 StreamReader rs = new StreamReader(stream, Encoding.Default);
 Char[] read = new Char[256];
 int count = rs.Read(read, 0, 256);
 StringBuilder sb = new StringBuilder();

 while (count > 0)
 {
 String str = new String(read, 0, count);
 sb.Append(str);
 count = rs.Read(read, 0, 256);
 }

 rs.Close();
 SetText(sb.ToString());
 }
 catch (Exception ex)
 {
 SetText("エラー:" + ex.Message);
 }
 }
 , state
 );
 }

 /// <summary>
 /// ワーカースレッドで文字列をtextBox2の表示文字列に設定する。
 /// </summary>
 /// <param name="text"></param>
 private void SetText(string text)
 {
 if (this.textBox2.InvokeRequired)
 {
 SetTextCallback d = new SetTextCallback(SetText);
 this.Invoke(d, new object[] { text });
 }
 else
 {
 this.textBox2.Text = text;
 }
 }


 /// <summary>
 /// フォームが開くとき
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Form1_Load(object sender, EventArgs e)
 {
 textBox1.Text = MySettings.Default.LastInput;
 }

 /// <summary>
 /// Requestボタン
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void button1_Click(object sender, EventArgs e)
 {
 try
 {
 MySettings.Default.LastInput = textBox1.Text;
 MySettings.Default.Save();
 this.Request();
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message, "エラー");
 }
 }
 }
}
 
1件のコメント

投稿者: : 2011/01/22 投稿先 C#

 

C#: OleDb PostgreSQL

 

using System;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;

///<summery>
///メインクラス
///</summery>
public class Program
{
 ///<summery>メインメソッド</summery>
 ///<param>なし</param>
 ///<returns>なし</returns>
 public static void Main()
 {
 OleDbConnection conn = new OleDbConnection(GetConnString());
 conn.Open();
 OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM table1", conn);
 DataSet ds = new DataSet();
 adapter.Fill(ds);
 PrintData(ds);
 conn.Close();
 Console.WriteLine("End.");
 }

 ///<summery>接続文字列を作成</summery>
 ///<param>なし</param>
 ///<returns>接続文字列</returns>
 public static string GetConnString()
 {
 OleDbConnectionStringBuilder connString = new OleDbConnectionStringBuilder();
 connString["Provider"] = "PostgreSQL";
 connString["Data Source"] = "localhost";
 connString["Location"] = "test";
 connString["UID"] = "postgres";
 connString["PWD"] = "ATX2TX";
 connString["Timeout"] = "15";
 return connString.ToString();
 }

 ///<summery>データセット内のテーブル[0]を表示</summery>
 ///<param name="ds">データを表示するDataSet</param>
 ///<returns>なし</returns>
 public static void PrintData(DataSet ds)
 {
 DataRowCollection rows = ds.Tables[0].Rows;

 foreach (DataRow r in rows)
 {
 string code = r[0].ToString();
 string name = r[1].ToString();
 string count = r[2].ToString();
 Console.WriteLine(code + ", " + name + ", " + count);
 }
 }
}

 
コメントする

投稿者: : 2010/11/23 投稿先 C#

 

タグ: , ,

C#: OleDb Excel

 

using System;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;

public class Program
{
 public static void Main(string[] args)
 {
 OleDbConnection conn = new OleDbConnection(GetConnString());
 conn.Open();
 // ExcelワークシートではRange1という範囲を定義しておく
 OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM Range1", conn);
 DataSet ds = new DataSet();
 adapter.Fill(ds);
 PrintData(ds);
 conn.Close();
 Console.WriteLine("End.");
 }

 public static string GetConnString()
 {
 OleDbConnectionStringBuilder connString = new OleDbConnectionStringBuilder();
 connString["Provider"] = "Microsoft.Jet.OLEDB.4.0";
 connString["Data Source"] = "Book1.xls";
 connString["Extended Properties"] = "Excel 8.0";
 return connString.ToString();
 }

 public static void PrintData(DataSet ds)
 {
 DataRowCollection rows = ds.Tables[0].Rows;

 foreach (DataRow r in rows)
 {
 string code = r[0].ToString();
 string name = r[1].ToString();
 string count = r[2].ToString();
 Console.WriteLine(code + ", " + name + ", " + count);
 }
 }
}

 
コメントする

投稿者: : 2010/11/23 投稿先 C#

 

タグ: , ,