在数据表列中找到最长的字符串

时间:2019-04-15 07:17:47

标签: c# linq

我想知道是否可以创建“单行” Linq来检索特定Datatable列的最长字符串值,这意味着所有列数据(数字,日期,字符串...)都应转换为字符串然后返回最长的字符串。

我发现的只是从列表中获取最长字符串或最大长度值的方法。

这是我到目前为止尝试过的(长度错误):

string maxString = dt
  .AsEnumerable()
  .Select(row => row[mycolumn].ToString())
  .Where(s => s.OrderByDescending(st => st.Length).First());

3 个答案:

答案 0 :(得分:15)

您正在寻找ArgMax-一个,以使其具有某种属性的最大值。标准Linq不提供ArgMax,但您可以通过Aggregate来实现(即从序列中获得单个值):

 string maxString = dt
   .AsEnumerable()
   .Select(row => row[mycolumn].ToString())
   .Aggregate((s, a) => a.Length > s.Length ? a : s);

答案 1 :(得分:10)

您快到了:

string maxString = dt.AsEnumerable()
                     .Select(row => row[mycolumn].ToString())
                     .OrderByDescending(st => st.Length).FirstOrDefault();

Where需要一个谓词(该函数将返回true或false)。取而代之的是像您一样对投影(.Select)进行排序并检索第一项。


请注意,这是一个O(nlogn)解决方案,可以通过不进行排序而是找到具有最大长度的项目来将其改进为O(n)解决方案。这样做的一种可能方法是Dimitry的回答。对于不确定的收藏,我不确定是否真的会感到与众不同,但确实值得注意。


请注意,您还可以使用可以通过Nuget添加的MoreLinq's .MaxBy(对于GitHub repo),这将为您提供O(n)的性能和所需的“单线”:

var row = dt.AsEnumerable().MaxBy(r => r[mycolumn].ToString().Length);

答案 2 :(得分:3)

首先不要在html(JSON.stringify(response.result.rows, null).split("},{").join("}\n{")) 之后立即使用AsEnumerable。 这样写:

dt.