1

这是目标:获取一个通用的人员列表,并在我的模型中按男性、女性和儿童进行排序......为了这个网站和我的隐私,我还重命名了一些东西。请关注下面的 lambda 表达式!谢谢!

我收到此错误:

无法转换 System.Collections.Generic.IEnumerable<bool>System.Collections.Generic.IEnumerable<Project1.DataClasses.DataObjects.People>

人物模型:

public List< People> Men { get; set; }
public List< People> Women { get; set; }
public List< People> Kids { get; set; }
public List< People> Babies { get; set; }

控制器:

public ActionResult GetPeople(PeopleModels Peoples)
{
    List<People> listPeoples = new List<People>();

    listPeoples = DataClass.GetAllPeoples();

    // this is the code I cannot get to work.
    var men = listPeoples .Select(m => m.Sex == "M");
    Peoples.Men = men.ToList<People>();

    // Women, Children too..

    return View("Employees", Peoples);
}
4

5 回答 5

7

您正在寻找Where声明。

  // Get People wher the Sex = "M"
  Peoples.Men = listPeoples.Where(m => m.Sex == "M").ToList();
于 2013-02-20T06:49:07.503 回答
4

您当前仅选择m.Sex属性并尝试将其列表分配给List<People>这就是错误的原因。你可以简单地做:

Peoples.Men = listPeoples.Where(m => m.Sex == "M").ToList();

你也不需要Tolist<People>(),简单ToList()的就可以了。

于 2013-02-20T06:50:45.570 回答
2

您不了解 Linq 查询的基础知识。“选择”语句必须投影结果。例如:

var a = new List<string>{"ab", "abc", "abcd"};
var b = a.Select(x=>x.Length).ToList();

这里发生的是选择所有“a”元素的长度并将它们保存到现在List<int>包含的变量 b{2,3,4}

您需要的是“Where”语句,它通过集合中的谓词过滤对象(任何 IEnumerable 对象)

var c = a.Where(x=>x.Length<4).Select(x=>x.Length).ToList();

另一种语法:

var c = (from element in a 
         where element.Length<4
         select x=>Length).ToList();

我们说,从列表中 元素 中, 我们需要获取长度小于 4 个字符的元素并选择所有这些长度,将它们放入列表并分配给c变量。

建议您阅读有关主题的更多信息并检查这些示例

于 2013-02-20T07:49:12.073 回答
1

您的 men 集合包含布尔类型的项目。

  var men = listPeoples .Select(m => m.Sex == "M"); // returns a boolean  collection     satisfying the condition
  Peoples.Men = listPeoples .Where(m => m.Sex == "M").ToList(); // This should be what you want 

你也可以做

var men = listPeoples .Where(m => m.Sex == "M");
Peoples.Men = men.ToList();
于 2013-02-20T07:03:19.887 回答
0

使用 group 您可以将每种类型放入自己的集合中:

var grouped = from person in people
    group person by person.Type into g
    select new {Key = g.Key, people = g};

唯一的问题是选择每个集合,这是迄今为止我得到的最好的:

List<Person> men = new List<Person>(), women = new List<Person>(), children = new List<Person>(), babies = new List<Person>();

foreach (var persons in grouped)
{
    switch (persons.Key)
    {
        case PersonType.Male: men = persons.people.ToList(); break;
        case PersonType.Female: women = persons.people.ToList(); break;
        case PersonType.Child: children = persons.people.ToList(); break;
        case PersonType.Baby: babies = persons.people.ToList(); break;
    }
}
于 2013-08-19T06:41:09.877 回答