扩展和过滤C#数组

本文关键字:数组 过滤 扩展 | 更新日期: 2023-09-27 18:20:05

我最近做了很多List<SomeType>->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序列化类,所以我不得不使用数组(MemberType[]),而不是漂亮的泛型集合。我相信有一种更好的方法可以做这种简单的事情,所以如果你知道一种(不会增加过度的复杂性),请告诉我。

扩展和过滤C#数组

有一些扩展方法可以做到您所描述的:

var membersList = members.ToArray();
members = memberList.Where(m => m.someProperty != sentinelValue).ToArray();
members = members.Concat(new[] { newMember }).ToArray();

List<T>类提供了一个ToArray()方法,该方法将列表项作为数组返回。另外,如果你使用的是.NET 3.5,你可以使用Linq来缩短你的过滤代码,以有效地做到这一点:

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

Linq来营救!

过滤:

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

扩展:

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

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

但说真的,您的XML序列化类需要扔掉并重写。