我有一个名为AxiomSubset
的C#列表,其中有6列,其中有几行数据,我想检查列表中特定列的所有值是否相等,如果它们相等则应该返回true并转到下一列并检查它们的相等性等等。
例如,我在列表中有以下数据行
CC Mon str stg rate units
HP 15-Mar 4.0800 4
HP 15-Feb 4.0800 4
HP 15-Jan 4.0800 4
LN 15-Mar 3.25 Put 0.0500 50
LN 15-Feb 3.25 Put 0.0500 50
LN 15-Jan 3.25 Put 0.0500 50
LN 15-Mar 3.50 Put 0.1000 50
LN 15-Feb 3.50 Put 0.1000 50
LN 15-Jan 3.50 Put 0.1000 50
在检查列CC
的相等性时的上述数据中,它应该返回false,因为它们都不相等
我尝试按照以下方式进行操作,将一行与较早的行进行比较,但显然没有给出预期的结果
for (int i = 0; i < AxiomSubSet.Count; i++)
{
if (AxiomSubSet[i].CC.ToString() == AxiomSubSet[i + 1].CC.ToString())
{
result = true;
if (AxiomSubSet[i].term.ToString() == AxiomSubSet[i + 1].ToString())
{
//So On
}
}
}
上面的代码一次比较两个值,如果它们相等则返回true而不考虑其他不需要的值。
有更好的方法吗?
答案 0 :(得分:5)
您可以为每列执行类似的操作。
if((AxiomSubSet.Select(x => x.CC).Distinct().ToList()).Count > 1)
答案 1 :(得分:1)
我会考虑使用linq。取第一个值来查找列表中的所有匹配值,如果列表中的计数匹配,则所有值都相同。
var listMatch = AxiomSubSet.Where(x => x.CC == AxiomSubSet[0].CC).Select(x => x);
result = listMatch.Count == AxiomSubSet.Count;
或更简洁
if (AxiomSubSet.Where(x => x.CC == AxiomSubSet[0].CC).Select(x => x).Count == AxiomSubSet.Count)
答案 2 :(得分:1)
您可以根据需要更改您的IComparer,但我在这里作为一个简单的例子给您:
public class AxiomSubset : IComparer<AxiomSubset>
{
public int Compare(AxiomSubset x, AxiomSubset y)
{
if (x.CC.CompareTo(y.CC) != 0)
{
return x.CC.CompareTo(y.CC);
}
else if (x.term.CompareTo(y.term) != 0)
{
return x.term.CompareTo(y.term);
}
else
{
return 0;
}
}
}
答案 3 :(得分:1)
from a in AxiomSubSet
group a by a.CC into g
select g.Count
您可以按列进行分组,如果计数大于1,您就知道有不同的值。您可以将其转换为lambda
,我更喜欢该语法以提高可读性。