我想知道是否/如何使用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
}
}
答案 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}");
}
}
}
输出
答案 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() }