我想知道是否可以创建“单行” Linq来检索特定Datatable列的最长字符串值,这意味着所有列数据(数字,日期,字符串...)都应转换为字符串然后返回最长的字符串。
我发现的只是从列表中获取最长字符串或最大长度值的方法。
这是我到目前为止尝试过的(长度错误):
string maxString = dt
.AsEnumerable()
.Select(row => row[mycolumn].ToString())
.Where(s => s.OrderByDescending(st => st.Length).First());
答案 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.