我想知道是否有可能创建“单行” 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)
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)