【问题标题】:Comparing values of a column C# list all together比较列 C# 列表的所有值
【发布时间】:2014-08-13 14:10:25
【问题描述】:

我有一个名为 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,而不考虑其他不需要的值。

有更好的方法吗?

【问题讨论】:

  • 很少的 C# 代码块 return 一个值并继续执行。你真正想要完成什么?
  • @FarhadJabiyev 我认为将一行中所有列的值与下一行进行比较,但我想比较列表中单个列的所有行,就像比较 CC 的所有值一样

标签: c# list


【解决方案1】:

你可以为每一列做这样的事情。

if((AxiomSubSet.Select(x => x.CC).Distinct().ToList()).Count > 1)

【讨论】:

  • tolist() 有必要吗?
  • 我认为这并不能完全回答问题,因为它只检查第一列
  • 如果您希望使用 .Count 属性,@Davide ToList() 是必需的。见:stackoverflow.com/questions/168901/…
  • @Flat Eric 我相信其余的应该相当简单;将此 ^ 行包装在遍历所有列的 foreach 循环中,这是我想到的第一件事。
  • @IlyaNemtsev 比 count() 方法好吗?
【解决方案2】:

您可以根据需要更改您的 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】:

    我会考虑使用 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)
    

    【讨论】:

      【解决方案4】:
      from a in AxiomSubSet
      group a by a.CC into g
      select g.Count
      

      您可以按列分组,如果计数大于 1,您就知道有不同的值。您可以将其转换为 lambda,我更喜欢该语法以提高可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多