使用GroupBY

时间:2017-03-30 06:03:29

标签: c# linq

我有一个对象列表。我想根据特定属性将此列表拆分为对象列表。任何特定属性值为某个值的对象应该在一个列表中,其余的在另一个列表中。我想使用一个可以实现的LINQ查询。

下面的一些伪代码:

class A {
   string X {get; set;} 
}

var list = listOfAs;
List<A> listOfAWithXEqualAA;
List<A> listOfAWithXNotEqualAA;

var query = one LINQ query to populate above declared lists.

请建议我这样的查询。

5 个答案:

答案 0 :(得分:1)

List<A> FirstList = listofAs.Where(a => a.x == "matchvalue").ToList();
List<A> SecondList = listofAs.Where(a => a.x != "matchvalue").ToList();

答案 1 :(得分:1)

这应该使用所需的值填充您的列表

List<A> listOfAs = new List<A>() ;
string AA = "foo";
List<A> listOfAWithXEqualAA = listOfAs.Where(x => x.X == AA).ToList();
List<A> listOfAWithXNotEqualAA = listOfAs.Where(x => x.X != AA).ToList();

类:

class A
{
    public  string X { get; set; }
}

答案 2 :(得分:1)

var groups = listOfAs.Select(a=>new {a, IsX = a.X == "AA"}).GroupBy(arg=>arg.IsX);

List<A> listOfAWithXEqualAA  = groups.Where (g=>g.Key)
                                     .SelectMany(g=>g.Select(o=>o.a).ToList();
List<A> listOfAWithXNotEqualAA = groups.Where (g=>!g.Key)
                                       .SelectMany(g=>g.Select(o=>o.a).ToList();

这将为您提供两个带有相关信息的IGrouping

否则,您可以创建一个列表,然后使用except获取另一个列表:

List<A> listOfAWithXEqualAA  = listofAs.Where (a=>a.X=="AA").ToList();
List<A> listOfAWithXNotEqualAA = listofAs.Except(listOfAWithXEqualAA);

答案 3 :(得分:1)

使用LINQ,你可以使用Select,Where等创建一个IEnumerable。 为什么只使用简单的if:

        foreach (var item in list)
        {
            if (item.X  == "AA")
            {
                listOfAWithXEqualAA.Add(item);
            }
            else
            {
                listOfAWithXNotEqualAA.Add(item);
            }
        }

答案 4 :(得分:-1)

您无法通过单个LINQ实现此目的,但必须编写2个查询

var listOfAWithXEqualAA = listofAs.Where(a => a.X == "AA").ToList();
var listOfAWithXNotEqualAA = listofAs.Where(a => a.X != "AA").ToList();

否则循环遍历列表并使用“if”

将值分配给相应的列表