我想知道是否有一种方法可以计算一行满足的条件数,以便按符合大多数条件的返回值对返回值进行排序。
让我们说这张桌子是这样的:
假设条件为size=M
或color=blue
或size<40
我期望的结果是这样的:
Id3 (3 conditions)
Id4 (2 conditions)
Id1 (1 condition)
Id2 (1 condition)
答案 0 :(得分:2)
这是使用linq实现条件聚合的一种方法。
请注意,由于您写了size=M or color=blue or size<40
,所以我不得不稍微调整一下您的条件-但是size既可以是字符串,也可以是数字,不能完全相同-所以我认为这是一个错字应该是size=M or color=blue or value<40
。
此外,由于您没有提供MCVE,因此我为您做到了(请尝试为您的下一个问题创建MCVE)
因此,让我们从一个简单的数据类开始:
class Data
{
public Data(string id, string size, int value, string color)
{
Id = id;
Size = size;
Color = color;
Value = value;
}
public string Id {get;set;}
public string Size {get;set;}
public int Value {get;set;}
public string Color {get;set;}
public override string ToString()
{
return string.Format("Id = {0}, Size = {1}, Value = {2}, Color = {3}", Id, Size, Value, Color);
}
}
现在,让我们创建该类的列表,并使用您提供的样本数据填充它:
var sampleData = new List<Data>()
{
new Data("Id1", "L", 35, "red"),
new Data("Id2", "L", 65, "blue"),
new Data("Id3", "M", 34, "blue"),
new Data("Id4", "S", 32, "blue"),
new Data("Id5", "S", 55, "green")
};
由于我不想两次编写条件,因此我决定首先选择一个新的匿名类型,该类型包含Data类和另一个我称为ConditionsMatched
的属性,以保存此条件的数量。数据实际匹配。
然后,我要做的就是过滤此select
的结果,以仅返回ConditionsMatched
大于0
的那些实例:
var result = sampleData
.Select(d => new
{
Data = d,
ConditionsMatched =
(d.Size == "M" ? 1 : 0) +
(d.Color == "blue" ? 1 : 0) +
(d.Value < 40 ? 1 : 0)
})
.Where(a => a.ConditionsMatched > 0);
结果是IEnumerable<AnonymousType>
,其中仅包含至少符合一个条件的数据。