获取列表中具有另一个列表中的一个属性的所有项目的计数

时间:2019-05-08 18:51:00

标签: c# linq

我想知道是否/如何使用LINQ进行以下操作:我有一个具有某些属性的对象列表,以及另一个与某个属性对应的不同值的列表。

示例:

A = [{id=1, property=1}, {id=2, property=1}, {id=3, property=2}]
B = [1, 2]

有没有一种方法可以仅使用LINQ来实现以下目的(获取计数列表)?

var counts = new List<int>();
foreach (var b in B)
{
    counts.Add(A.Where(a => a.property == b).Count();
}

示例代码:

public class MyObject
{
    public MyObject(int id, int prop)
    {
        Id = id;
        Property = prop;
    }
    public int Id { get; set; }
    public int Property { get; set; }

    public void test()
    {
        var A = new List<MyObject>
        {
            new MyObject(1, 1), new MyObject(2, 1), new MyObject(3, 2)
        };
        var B = new List<int>{1, 2};

        // LINQ magic

        // 2 objects with property 1
        // 1 object with property 2
    }
}

5 个答案:

答案 0 :(得分:1)

您可以将Count方法与谓词一起使用:

var A = new[] {new {id = 1, property = 1}, new {id = 2, property = 1}, new {id = 3, property = 2}};
var B = new[] {1, 2};

var count = B.Count(b => A.Any(a => a.property == b));

上面的代码将检查B中的每个成员,如果A中至少有一个成员具有该值的property,则将被计数

答案 1 :(得分:1)

是的,请使用选择运算符仅选择要比较的特定属性,然后使用相交和计数来获得计数。示例:

var listOfObjects = new List<PocoClass>()
{
    new PocoClass(){Id=1,Property=3},
    new PocoClass(){Id=2,Property=2}
};

var intArray = new int[] { 1, 2, 3 };

var count = listOfObjects.Select(o => o.Property).Intersect(intArray).Count();

答案 2 :(得分:0)

将B转换为列表并在其上运行ForEach

B.OfType<int>().ToList().ForEach(m=>{ 
      counts.Add(A.Where(a => a.property == m).Count();
})

答案 3 :(得分:0)

当然,您可以循环遍历这些值,并针对每个值获取具有Property == value的项目数。

在下面的示例中,我选择一个匿名类型,该类型包含Value和每个具有Count的项目的Property == value

public class Data
{
    public int Id { get; set; }
    public int Property { get; set; }
}

public class Program
{
    private static void Main()
    {
        var allData = new List<Data>
        {
            new Data {Id = 1, Property = 1},
            new Data {Id = 2, Property = 1},
            new Data {Id = 3, Property = 2},
        };

        var values = new[] {1, 2};

        var results = values.Select(value => 
            new {Value = value, Count = allData.Count(item => item.Property == value)});

        foreach (var result in results)
        {
            Console.WriteLine($"{result.Count} objects with Property {result.Value}");
        }
    }
}

输出

![![enter image description here

答案 4 :(得分:0)

这是您需要的要点。我在没有c#编译器的情况下键入此命令,因此希望它没有错误。

var results = 
    from a in A
    join b in B on a.property equals b
    group a by a.property into g
    select new { Property = g.Key, Count = g.Count() }