如何比较LINQ中的两个匿名变量列表

本文关键字:两个 列表 变量 何比较 比较 LINQ | 更新日期: 2023-09-27 17:50:49

链接到csv文件

我有以下代码,通过csv文件进行过滤,并将第1列和第5列存储在一个列表(values)中,将第7列和第11列存储在另一个列表(values1)中。

目的是搜索第一个列表(values)中的每个元素,然后检查第二个列表(value1)中的每个元素的匹配周期,然后添加所有匹配案例的支出,然后与第一个列表的支出进行比较,误差范围为1%。

下面的代码负责使用下面的两个foreach循环搜索每个列表部分。但是我有问题定义一个变量(即var temp不工作,给了我一个错误的FormatException:输入字符串不是在一个正确的格式"错误,当我运行代码)存储或添加在第二个列表中有多个周期的事件一起支付。

当我定义列表时,是否可以定义变量支付和周期的类型?问题在于它们是匿名变量,就像被定义的那样。

感谢您的帮助。

var values = File.ReadLines(path).Skip(1)
      .Select(x => x.Split(','))
      .Where(x => x[0] != string.Empty)
      .Select(x => new { Period = int.Parse(x[0]), Payout = decimal.Parse(x[4]) })
      .ToList();
values = values.OrderBy(x => x.Period)
.ToList();
var values1 = File.ReadLines(path).Skip(1)
      .Select(x => x.Split(','))
      .Where(x => x[0] == string.Empty)
      .Select(x => new { Period = int.Parse(x[6]), Payout = decimal.Parse(x[10]) })
      .ToList();
//Console.WriteLine(values1);
values1 = values1.OrderBy(x => x.Period)
.ToList();
//Console.WriteLine(values1[0]);
decimal temp = 0;
foreach (var value in values)
{
    foreach (var value1 in values1)
    {
        if (value.Period == value1.Period)
        {
            temp += value1.Payout;
        }
    }
}

如何比较LINQ中的两个匿名变量列表

FormatException表示您的某些数据不是您所期望的。

您可以使用如下代码检查无效数据。

   int dummyPeriod ;
   decimal dummyPayout;
   var badValues = File.ReadLines(path).Skip(1)
     .Select(x => x.Split(','))
     .Where(x => !Int32.TryParse(x[0], out dummyPeriod) || 
              !Decimal.TryParse(x[4], out dummyPayout))
     .Select(x => new { Period =  x[0] , Payout = x[4]   })
     .ToList();

如果你想忽略这些行,你可以反转选择,例如

var values = File.ReadLines(path).Skip(1)
  .Select(x => x.Split(','))
  .Where(x => Int32.TryParse(x[0], out dummyPeriod) && 
              Decimal.TryParse(x[4], out dummyPayout))    
  .Select(x => new { Period = int.Parse(x[0]), Payout = decimal.Parse(x[4]) })
  .ToList();

注意

 decimal.parse(x[4]) 
如果x[4]是空字符串,

将失败,而您可能希望将其解释为零。

From line: .Select(x => new { Period = int.Parse(x[0]), Payout = decimal.Parse(x[4]) })

此操作失败,因为您正在尝试将无效字符串转换为整数或十进制。以下所有操作都将失败:

int.Parse("20.5")
int.Parse("20z")
decimal.Parse("20.5.5")
decimal.Parse("20.0m")

仔细检查你的输入,很可能你正在读取的数据不是你所期望的。也就是说,x[0]和/或x[4]不是有效的文本,不能转换为各自的数字类型。添加一个断点或提取该行为,以便您可以调试/测试它以验证您的文本输入。

可能您的列索引关闭,或者您的CSV文件中的一行格式不正确。

取出双环,对期间和总支出进行连接。

try this:

class Program
{
    static void Main()
    {
        List<Dur> fList = new List<Dur>();
        fList.Add(new Dur(10));
        fList.Add(new Dur(11));
        fList.Add(new Dur(12));
        fList.Add(new Dur(13));
        List<Sec> sList = new List<Sec>();
        sList.Add(new Sec(20));
        sList.Add(new Sec(22));
        sList.Add(new Sec(11));
        sList.Add(new Sec(10));
        sList.Add(new Sec(25));
        var result = from x in fList
                  join y in sList on x._x equals y._y
                  select x._x;
        var sum = result.Sum();
        Console.Write(sum);
        Console.ReadKey();
    }
}
class Dur
{
    public Dur(int x)
    {
        _x = x;
    }
    public int _x;
}
class Sec
{
    public Sec(int y)
    {
        _y = y;
    }
    public int _y;
}