只是寻找最好的方法来处理以下行并将其保持在一行......
if (int.TryParse(data.Min(x => x.ItemArray[i].ToString()), out result))
包含在以下例程中......
var data = model.Data.AsEnumerable();
for (int i = 0; i < model.Data.Columns.Count; i++)
{
int result;
if (int.TryParse(data.Min(x => x.ItemArray[i].ToString()), out result))
{
model.Minimum.Add(DataTableUtility.MinValue(result));
}
}
这样可以正常工作,直到ItemArray包含没有值的行(空对象)。是否有简单的方法将其保持在单行并处理这种情况?
答案 0 :(得分:0)
您应该使用DataRow
和DataColumn
类中定义的方法。假设表中的每一列都是一个可以为空的int,你可以这样做:
var mins =
from row in table.AsEnumerable()
select (from DataColumn c in table.Columns
where !row.IsNull(c)
select row.Field<int>(c)).Min();
如果您有混合类型,请检查类型并仅接受整数:
var mins =
from row in table.AsEnumerable()
select (from DataColumn c in table.Columns
where !row.IsNull(c)
where c.DataType == typeof(int)
select row.Field<int>(c)).Min();
如果你实际上将整数存储为字符串......那么你还有其他问题...那么你必须解析它。只是不要试图聪明。创建一个方法来尝试解析值并在成功时返回一个值,否则返回0(或null)。
int? TryConvertInt32(obj value)
{
try { return Convert.ToInt32(value); } catch { return default(int?); }
}
var mins =
from row in table.AsEnumerable()
select row.ItemArray.Select(v => TryConvertInt32(v) ?? 0).Min();
等等......
答案 1 :(得分:0)
我意识到转换为字符串是一个早期的括号,导致它按字符串值分钟。在此之后当然铸造更复杂的类型,如双重需要进一步处理。无法完全在一条线上完成,但工作解决方案(作为其中一些建议的混合如下......
var data = model.Data.AsEnumerable();
for (int i = 0; i < model.Data.Columns.Count; i++)
{
int result;
if (int.TryParse(data.Min(x => TryConvertInt32((x.ItemArray[i] is System.DBNull || x.ItemArray[i] == null ? int.MaxValue : x.ItemArray[i]))).ToString(), out result))
{
model.Minimum.Add(DataTableUtility.MinValue(result));
}
}
使用上面建议的静态“处理程序”..
private static int? TryConvertInt32(对象o) { 尝试 { return Convert.ToInt32(o); } 抓住 { return default(int?); } }
答案 2 :(得分:-1)
易:
if (int.TryParse(data.Min(x => (x.ItemArray[i] ?? int.MaxValue).ToString()), out result))
只需添加int的最大值,因为您正在寻找将被丢弃的最小值。
编辑:
所以,如果我理解那么你会在那里检查任何类型,所以这更好:
if (int.TryParse(data.Min(x => (x.ItemArray[i] ?? "").ToString()), out result))
这样,在null项目上,TryParse将失败。
编辑:
支持dbnull:
if (int.TryParse(data.Min(x => (x.ItemArray[i] is System.DBNull || x.ItemArray[i] == null ? "" : x.ItemArray[i]).ToString()), out result))
答案 3 :(得分:-1)
你不想这样做......
原因很简单,为什么你不应该这样做?
因为这并没有传达意图。究竟是什么ItemArray
,你为什么要.ToString
呢?你确定你不想安全演员吗?文化怎么样?你应该如何解析字符串&#34; 1,234&#34; (在非洲大陆,即#34;一点二三四&#34;,而一位说英语的人会解析那个&#34;一千二百三十四&#34;)?
你确定你不想要
var results = from i in Enumerable.Range(0, model.Data.Columns.Count)
where data.Min(x => x.ItemArray.OfType<int>().DefaultIfEmpty())
select temp;