列表中具有共同特征的组元素

时间:2014-02-21 00:06:59

标签: c# .net linq

我想通过某个crtieria来命令某个类的元素。

例如,如果我有这个课程:

public class Contact {

public string FirstName  { get; set; }
public string LastName{ get; set; }


}

以及此类的列表:

        List<Contact> ContactList = new List<Contact>
        {

            new Contact{

             FirstName  = "John" ,
             LastName =  "Smith"
            }   ,


            new Contact{
             FirstName = "Andrew" , 
                LastName = "Wallace"

            }   ,
            new Contact{
             FirstName = "Andrew" , 
                LastName = "Smith"

            }   ,   new Contact{

             FirstName  = "John" ,
             LastName =  "Wallace"
            }   ,






        };

我如何使用Linq订购我的ContactList,然后创建两个列表,其中一个名字为John的名字为联系人,另一个名字为Andrew的名字为<?p>

这个列表很小但是如果我有一个巨大的列表并且我不知道列表中的内容以及如何针对FirstName特征订购它呢?

2 个答案:

答案 0 :(得分:1)

var result =ContactList.GroupBy(c => c.FirstName)
            .Select(c => c.ToList())
            .ToList()

那会给你一个List<List<Contact>>,其中包含两个列表。第一个包含Johns,第二个包含Andrews.Here是输出:

enter image description here

更新

根据您的评论,您可以使用字典

var dict = ContactList.GroupBy(c => c.FirstName)
            .Select(c => c.ToList())
            .ToDictionary(x => x.First().FirstName, x => x);

在此之后,您可以通过以下方式获取John的列表:

dict["John"] 

其中包含一个包含所有John的

的列表

答案 1 :(得分:0)

  

这个列表很小,但是如果我有一个巨大的列表并且我不知道列表中的内容以及如何根据FirstName特性订购它呢?

如果以名字为基础进行订购,您可以像Linq一样订购列表。

var listOrderedByName = ContactList.OrderBy(cl => cl.FirstName);

在这个示例中,您最终会得到一个列表,其中您的联系人首先与所有Andrew联系人一起订购,然后是所有John联系人。这也适用于一个巨大的列表。

  

我如何使用Linq来订购我的ContactList,然后它创建两个列表,其中一个名字是名字是John的联系人和另一个名字叫Andrew的人?

如果您碰巧知道联系人列表的具体内容,并且您只想要一个包含Johns的列表和一个包含Andrews的列表,那么您可以使用Linq这样做。

var listWithJohnContactsOnly = ContactList.Where(cl => cl.FirstName == "John");
var listWithAndrewContactsOnly = ContactList.Where(cl => cl.FirstName == "Andrew");

这会给你两个单独的列表。一个只与第一个名字“John”接触,另一个与名字为“Andrew”的联系人。如果您希望将它们分组并最终得到一个列表列表(每个列表包含具有特定名字的联系人),那么您可以像Selman22建议的那样使用GroupBy,而您不必知道内部的具体内容。你的清单。