扩展和过滤C#数组

时间:2012-01-12 21:19:09

标签: c#

我一直在做很多List<SomeType> - &gt;最近SomeType[]转换,尤其是当我过滤或扩展数组时。

例如过滤:

// 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 Serialization类,我必须使用数组(MemberType [])而不是一个很好的泛型集合。我相信有一种更好的方法来做这种简单的事情,所以如果你知道一个(不会增加不必要的复杂性)让我知道。

5 个答案:

答案 0 :(得分:5)

有一些扩展方法可以完全按照您的描述进行操作:

var membersList = members.ToArray();

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

List<T>类提供ToArray()方法,该方法将列表项作为数组返回。另外,如果您使用的是.NET 3.5,那么您可以使用Linq来缩短您的过滤器代码以实现此目的:

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

答案 3 :(得分:2)

Linq救援!

过滤

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

扩展:

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

答案 4 :(得分:1)

除了其他人已经指出的内容之外,如果你想跳过转换为列表步骤,还有System.Array.Resize()。

但严重的是,您的XML序列化类需要被丢弃并重写。