如何比较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;
}
}
}
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;
}