2012-01-12 10 views
4

最近、特にフィルタリングや配列の拡張を行っているときに、List<SomeType> - >SomeType[]の変換をたくさん行ってきました。例えば、フィルタリングのためにC#配列の拡張とフィルタリング

// filter the list 
var memberList = new List<MemberType>(); 
foreach (var member in members) 
{ 
    if (member.someProperty != sentinalValue) 
    { 
     memberList.Add(member); 
    } 
} 
// overwrite the old array with a new on dimensioned correctly 
members = new MemberType[memberList.Count]; 
memberList.CopyTo(members); 

または拡張:

// create the new member 
var newMember = new MemeberType(); 
// create a new array to hold the extended members 
newMembers = new MemberType[members.Length + 1]; 
// copy over the old members 
members.CopyTo(newMembers, 0); 
// add the new member 
newMembers[members.Length] = newMember; 
// overwrite old array with new array containing new member 
members = newMembers; 

私が原因で私たちが使用するXMLシリアル化クラスの代わりに素敵なジェネリックコレクションの(のmemberType [])配列を使用する必要があります。私は、この単純なことをやるより良い方法があると確信しています。もしあなたがそれを知っているなら(それは過度の複雑さを加えないでください)私に教えてください。

答えて

3
members = memberList.Where(m => m.someProperty != sentinelValue).ToArray(); 

members = members.Concat(new[] { newMember }).ToArray(); 
+0

Linqは私が使いたいと思っていたことを確信していました。拡張メソッドを使用している配列では実現できませんでした。私はintellisenseに示されている利用可能な方法を読んで、私が探していたものを見つけなければなりませんでしたが、stackoverflowはこの特定の質問よりも速かったです。 –

5

あなたが説明してきた正確に何をすべきかの拡張メソッドがあります。

var membersList = members.ToArray(); 
2

List<T>クラスが配列としてリスト項目を返すToArray()方法を提供は。あなたは.NET 3.5を使用していない場合の側としても、あなたのフィルタコードを短くしないのLINQを使用することができますを効果的にこの:救助へ

members = members.Where(m => m.someProperty != sentinalValue).ToArray(); 
2

LINQの!

フィルタリング:

members = members.Where(m => m.someProperty != sentinalValue).ToArray(); 

が拡張:他の人がすでに指摘している何を変換対をスキップしたい場合は

members = members.Concat(new [] {newMember}).ToArray(); 
+0

あなたのメンバーは、コンコ(newMember)の例が間違っていると思います。私はコンパイラから苦情を受け取ります - Domenicの答えに基づいて、私はmembers.Concat(new [] {newMember})を使う必要があると思います。 –

+0

@James - はい、そうです。キャッチをありがとう。回答を修正します –

1

は、またSystem.Array.Resize()があるほかリストステップ。

真剣に、XMLシリアル化クラスを破棄して書き直す必要があります。

+1

XMLシリアル化クラスはXSD.exeによって生成されます –