3

这个问题对我来说纯粹是学术性的,是我在这里回答的一个问题的衍生。

从具有特定元素值的数组列表中检索对象

这家伙正在使用一个普通的 ArrayList ......我知道不是最好的事情......充满了人

class Person
    {
        public string Name { get; set; }
        public string Gender { get; set; }

        public Person(string name, string gender)
        {
            Name = name;
            Gender = gender;
        }
    }

personArrayList = new ArrayList();

personArrayList.Add(new Person("Koen", "Male"));
personArrayList.Add(new Person("Sheafra", "Female"));

现在他想选择所有女性。我这样解决

var females = from Person P in personArrayList where P.Gender == "Female" select P;

另一个人提议

var persons = personArrayList.AsQueryable();
var females = persons.Where(p => p.gender.Equals("Female"));

但这似乎不起作用,因为编译器永远无法找出 p 的类型。

有谁知道我的查询的正确格式是第二种格式吗?

4

3 回答 3

3

您可以使用Cast<T>将其强制转换为强类型枚举:

var females = personArrayList.Cast<Person>()
                             .Where(p => p.gender.Equals("Female"));

Cast<T>如果您的数组列表中有任何其他内容,则会引发异常Person。您可以使用OfType<T>而不是Cast<T>只考虑那些类型的对象Person

在旁注中,请使用枚举来表示性别,而不是字符串。

enum Sex { Male, Female }

class Person
{
    public Sex Gender { get; set; }
}
于 2013-10-19T20:23:46.137 回答
2

由于ArrayList有无类型的成员,您必须将成员转换为Person

var females = persons.OfType<Person>().Where(p => p.gender.Equals("Female"));
于 2013-10-19T20:23:06.757 回答
1

转换personArrayList为它的元素类型,你就完成了。

var persons = personArrayList.Cast<Person>();
于 2013-10-19T20:25:01.797 回答