2009-05-22 15 views

答えて

18

我々はList<string>を持っていて、文字列の長さが5

よりも大きい場合にのみ項目以下のコードをしたいとしましょう、結果をList<string>を返します。

List<string> myList = new List<string>(); 
myList.Add("hello"); 
myList.Add("world!"); 
myList.Add("one"); 
myList.Add("large!!"); 
List<string> resultList = myList.FindAll(delegate(string s) { return s.Length > 5; }); 

resultList '世界!'と '大きな!!'。 この例では、anonymous methodが使用されています。 OnlyLargerThanFiveもPredicateと呼ばれ、

List<string> myList = new List<string>(); 
// .. 
List<string> resultList = myList.FindAll(OnlyLargerThanFive); 

//.. 

private static bool OnlyLargerThanFive(string s) 
{ 
    return s.Length > 5; 
} 

上記デリゲート:それはのようにも書くことができます。

+0

いい解決策ですが、これは内部的にforeachを使用しません。私はKthevarが自分自身を反復したくないということを意味していましたが、 – RobV

+1

lamdasの新機能、myList.FindAll(l => l.Length> 5)をどうやってやればいいのですか? –

+0

@RobV: for 'ループを内部的に実行します。もし私が間違っているなら、私を訂正してください。 – Razzie

2

@Razzieの方法以外にもLINQを使用することもできます。

List<string> myList = new List<string>(); 
myList.Add("hello"); 
myList.Add("world!"); 
myList.Add("one"); 
myList.Add("large!!"); 

var filtered=from s in myList where s.Length > 5 select s; 

PS: - :「

List<Item> l; 
l.FindAll(n => n.Something == SomethingElse); 

は、それが内部のforeachを使用できますが、できるは、最善の解決策は、ラムダを使用することです.NET 3および

+1

彼はLINQを持たないC#2.0について話していました。それ以外は正しいです(この例ではlambda構文を使用します) – Razzie

+0

おかげさまで@Razzie PSに答えを追加しました:) – TheVillageIdiot

3

上でのみ可能ですリスト全体を反復することなく実際にフィルタリングします。

+0

質問は2.0用です。lamdaはサポートされていません –

+0

申し訳ありません。通知。 – Migol

0

LINQを使用できます。私はこれをテストしていませんが、私はそれが「P」で始まるもののみを表示するようにパイの詰め物の私のリストの要素を絞り込むうと考えている:

List<string> list = new List<string>(); 

list.Add("Apple"); 
list.Add("Peach"); 
list.Add("Chocolate"); 
list.Add("Pear"); 
list.Add("Pumpkin"); 
list.Add("Cherry"); 
list.Add("Coconut"); 


var filteredOnes = from item in list 
        where item.StartsWith("P") 
        select item; 
+0

OPがC#2.0と言っていたという事実が完全に吹き飛んだ。間違いなくLINQはありませんが、OPがアップグレードされた場合にはこれが機能します。 – itsmatt

3

一覧<> .Findは(与えます最初に一致する出現)、List.FindAll()は一致するすべての出現を示します。複合型のリストを 例ですが、以下の通りである:

私はクラスレポートがあります。

public class Report 
{ 
    public string ReportName; 
    public ReportColumnList ReportColumnList; 
} 

、どこで、リスト内の項目を検索するにはレポート

List<Report> reportList; 

のリストをReportName = 'MyReport'、コードは次のようになります。

string reportName = "MyReport"; 
List<Report> myReports = reportList.FindAll(delegate(Report obj) { return obj.ReportName == reportName; }); 

最初のレポートを取得するには:デリゲートに渡されたオブジェクトがリストが移入されるタイプでなければならないこと

Report rc = reportList.Find(delegate(Report obj) { return obj.ReportName == reportName; }); 

注意。

0

LINQのように使用できます。

List<string> List = new List<string> { "i", "am", "using", "LINQ!" }; List<string> result = myList.Where(s => s.Length > 3).ToList();

はそれだけで、.NET 3以上で働いています。

関連する問題