在一条线上的Lambda内最小值

时间:2015-03-09 05:21:35

标签: c# lambda min

只是寻找最好的方法来处理以下行并将其保持在一行......

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包含没有值的行(空对象)。是否有简单的方法将其保持在单行并处理这种情况?

4 个答案:

答案 0 :(得分:0)

您应该使用DataRowDataColumn类中定义的方法。假设表中的每一列都是一个可以为空的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;