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

Luc*_*y82 11 c# linq

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

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

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

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

Dmi*_*nko 15

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

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

  • 该解决方案可能比接受的答案快得多,因为它不必对列表进行实际排序,只需对其进行一次迭代即可。 (2认同)
  • @Marie是的,我测试过,这是最快的。尽管在我的测试中,与将320k +行和7列使用OpenXML的数据导出到Excel的测试中的Gilad Green答案相比,它的差别是1秒。 (2认同)

Gil*_*een 10

您几乎在那里:

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

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


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


见,您还可以使用MoreLinq的.MaxBy,可通过的NuGet(对于加入GitHub库),这都将让你的O(n)表现和所期望的“一个班轮”:

var row = dt.AsEnumerable().MaxBy(r => r[mycolumn].ToString().Length);
Run Code Online (Sandbox Code Playgroud)

  • 是不是为了获得最大效率而进行排序?还是LINQ对此进行了优化? (3认同)