C#でサブリストを取得する方法


91

私は持っています、List<String>そして私はこのリストからサブリストを取り除く必要があります。.NET 3.5でこれに使用できるListのメソッドはありますか?


あなたが持っているもののコードサンプルを見せてくれますか、それとも明確にできますか?私はその質問に従わない。
デビッド

List <String> list = new list <String>();というリストがあります。私は..長さ-1にインデックス2から、このリストの発言のサブリストを取る必要がある
トーマスManalil

回答:


131

List :: GetRange(firstIndex、count)が必要です。http://msdn.microsoft.com/en-us/library/21k0e39c.aspxを参照してください

// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)

それはあなたが求めているものですか?

元のリストからサブリストアイテムを削除する場合は、次の操作を実行できます。

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}

4
foreachでアイテムを繰り返し処理している間は、リストからアイテムを削除することはできません。
slugster 2009

スラッグスター; リスト「a」から削除しながら、リスト「b」を繰り返し処理しています。それは合法です:)
Josh

6

リストでLINQクエリを実行するのと同じくらい簡単でしょうか?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();

1
これは元のリストのセグメントのコピーであり、元のリストの一部のビューではありません。
Asad Saeeduddin 2015

@Asadこの回答のポイントは、OPがLINQを使用できることを説明することでした。あなたはそれがコピーを作成することを指摘しました。素晴らしい。あなたの才能は、おそらくこの質問を編集する際に、私が5。5年前に残したよりもさらに細かい点を説明するために使用することができます。あなたがそれを編集するならば、あなたは衒学のインターネット正義リーグで信用を得るでしょう、そしてそれはよく稼がれるでしょう!
p.campbell 2015

11
私は(他の人と同じようにsubListJavaに似たものを探していました。これは、元のリストに変更可能なビューを公開します。これは動作が異なり、すぐにはわからないかもしれないので、後でこれを見る人の利益のために指摘しておくと役立つと思いました。話題から外れて、あなたはヨガや瞑想などを始めたいと思うかもしれません。あなたは何の挑発もなしに真っ赤に狂ったように0に行きました。
Asad Saeeduddin 2015

3

LINQのWhere句を使用します。

List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");

var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");

上記のステートメントでは、「p」はリストにあるオブジェクトです。したがって、データオブジェクトを使用した場合、つまり:

public class Client
{
    public string Name { get; set; }
}

その場合、linqは次のようになります。

List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });

var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");

詳細に説明した後、最初の例を使用して次を追加します。z= x.GetRange(1、3); x.RemoveRange(1、3); x.AddRange(z.OrderByDescending(p => p));
slugster 2009

2

LINQの場合:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

foreachが必要な場合は、ToListは必要ありません。

foreach (string s in l.Skip(1).Take(2)){}

LINQの利点は、主要な要素をスキップしたい場合は、次のことができることです。

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

つまり、カウント/長さなどを気にする必要はありません。


0

コレクションクラスには、フィルターを定義するために渡された基準に基づいてコレクション(サブリスト)を返すメソッドを含めることができます。foreachループを使用して新しいコレクションを作成し、それを渡します。

または、「filtered」または「active」フラグ(プロパティ)を設定して、メソッドとループに既存のコレクションを変更させます。これは機能する可能性がありますが、マルチスレッドコードで問題を引き起こす可能性もあります。他のオブジェクトがコレクションのコンテンツに依存している場合、これはデータの使用方法に応じて良いか悪いかのどちらかです。


0

サブリストの項目を逆にする

int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));

0、1、4、3、2、5、6を与える


Range整数データ型の場合はtrueです。データ型がでDataTime、2つの特定の日付の間のレコードのリストを取得する必要がある場合はどうなりますか?
ジョギ2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.