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

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

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

Re[1]: IEnumerableについて


(過去ログ 132 を表示中)

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

■77911 / inTopicNo.1)  IEnumerableについて
  
□投稿者/ poppo (1回)-(2015/12/01(Tue) 09:19:55)

分類:[C#] 

C#でメソッドを定義する場合、悩んでいます。
public IEnumerable<string> GetNames()
{
// Listクラスを返す
}

public void test()
{
IEnumerable<string> names = GetNames();
// インデクサでアクセスや要素追加したい
}

namesに対してインデクサでアクセスしたい場合や
要素を追加、削除したい場合にListや配列に変換しなければ
ならないかと思います。

引数はListや配列を受け取れるようにするため
IEnumerableやIListで定義するべきかと思うのですが
returnの型については皆さんどのようにしているのでしょうか。
引用返信 編集キー/
■77913 / inTopicNo.2)  Re[1]: IEnumerableについて
□投稿者/ 魔界の仮面弁士 (578回)-(2015/12/01(Tue) 09:49:35)
> public IEnumerable<string> GetNames()
> {
> // Listクラスを返す
> }

戻り値を List<string> や IList<string> にしない理由は何でしょうか?


> namesに対してインデクサでアクセスしたい場合や
.ElementAt(n) とか。


> 要素を追加、削除したい場合にListや配列に変換しなければ
> ならないかと思います。
IList であれば、追加や削除が可能ですよね。

List<T> は
 IList<T>, IList
 ICollection<T>, ICollection
 IEnumerable<T>, IEnumerable
 IReadOnlyList<T>
 IReadOnlyCollection<T>
というインターフェイス群をサポートしているのですから、
GetName が List<string> を返すのなら、利用側としても
追加や削除に困ることは無いと思うのですが…。



> 引数はListや配列を受け取れるようにするため
> IEnumerableやIListで定義するべきかと思うのですが
その根拠が良く分かりませんでした。

IList<T> は追加や削除もサポートしていますが、
IEnumerable<T> は列挙が目的の型であって、
追加や加工は別の話ですよね。

加工が必要なら、加工をサポートした型を受け入れれば良い話であって、
IEnumerable として扱おうとしているオブジェクトに対して、
「要素を追加、削除したい場合にListや配列に変換しなければならない」
という状況になるとは思えませんでした。

受け取ったオブジェクトに対して直接、要素を追加、削除していくというのではなく、
各要素をシャローコピーして新たなコレクションに詰めなおす、だとか、
Linq を用いて 別の IEnumerable<T> インスタンスにする、というのなら分かりますが。
引用返信 編集キー/
■77914 / inTopicNo.3)  Re[1]: IEnumerableについて
□投稿者/ WebSurfer (725回)-(2015/12/01(Tue) 10:00:08)
No77911 (poppo さん) に返信

No77769 で質問された方と同一人物でしょうか? 違ったら失礼しました。
引用返信 編集キー/
■77915 / inTopicNo.4)  Re[2]: IEnumerableについて
□投稿者/ poppo (2回)-(2015/12/01(Tue) 10:15:32)
魔界の仮面弁士様ありがとうございます。
方針が見えてきました。

> 戻り値を List<string> や IList<string> にしない理由は何でしょうか?
理解できていないのですが、IEnumerableで実装しろと言われたことがありまして
C#での作法としてインタフェースはIEnumerableを使うのが一般的なのかと思いました。

>>namesに対してインデクサでアクセスしたい場合や
> .ElementAt(n) とか。
using System.Linq;
を追加していなかったので一覧にでていませんでした。
ありがとうございます。


public void methodA(IEnumerable<string> s)
{
// sに対する加工は必要でない
}
public void methodB(List<string> s)
{
// sを加工する
}
public List<string> methodC(IEnumerable<string> s)
{
List<string> list = new List<string>(s);
// listを加工し返す
return list;
}

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -