c#-使用linq聚合文本文件内容,以便将它们分组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-使用linq聚合文本文件内容,以便将它们分组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2052字,纯文字阅读大概需要3分钟。
内容图文
![c#-使用linq聚合文本文件内容,以便将它们分组](/upload/InfoBanner/zyjiaocheng/650/1b31231b58a74b469aadf5440273e942.jpg)
给出以下查询.
var query = files
.SelectMany(file => File.ReadAllLines(file))
.Where(_ => !_.StartsWith("*"))
.Select(line => new {
Order = line.Substring(32, 7),
Delta = line.Substring(40, 3),
Line = new String[] { line }
});
显然,这将产生具有以下属性的对象列表:顺序:字符串,增量:字符串和线:字符串[]
我有一个看起来像这样的物品清单.
{ 1, 'A', {'line1'} },
{ 1, 'A', {'line2'} },
{ 2, 'B', {'line3'} },
{ 1, 'B', {'line4 } }
是否可以使用Linq聚合或类似的功能构造在收集线的同时将所有相邻的Order和Delta组合收集在一起.
这样聚合就是包含所有“行”的项目列表
{ 1, 'A', {'line1', 'line2'} }
{ 2, 'B', {'line3'} }
{ 1, 'B', {'line4'} }
由于聚合顺序地进行迭代,因此应该有可能收集所有具有相同字段的相邻行.
循环很容易做到,但我正在尝试使用一组lambda来实现.
解决方法:
您将需要GroupBy的以下变体:
public static class EnumerableExtensions
{
public class AdjacentGrouping<K, T> : List<T>, IGrouping<K, T>
{
public AdjacentGrouping(K key) { Key = key; }
public K Key { get; private set; }
}
public static IEnumerable<IGrouping<K, T>> GroupByAdjacent<T, K>(
this IEnumerable<T> sequence, Func<T, K> keySelector)
{
using (var it = sequence.GetEnumerator())
{
if (!it.MoveNext())
yield break;
T curr = it.Current;
K currKey = keySelector(curr);
var currentCluster = new AdjacentGrouping<K, T>(currKey) { curr };
while (it.MoveNext())
{
curr = it.Current;
currKey = keySelector(curr);
if (!EqualityComparer<K>.Default.Equals(currKey, currentCluster.Key))
{
// start a new cluster
yield return currentCluster;
currentCluster = new AdjacentGrouping<K, T>(currKey);
}
currentCluster.Add(curr);
};
// currentCluster is never empty
yield return currentCluster;
}
}
}
具有此相邻分组,您的代码可以与Chris’s answer中的相同:
var query = files
.SelectMany(file => File.ReadAllLines(file))
.Where(_ => !_.StartsWith("*"))
.Select(line => new
{
Order = line.Substring(32, 7),
Delta = line.Substring(40, 3),
Line = new String[] { line }
})
.GroupByAdjacent(o => new { o.Order, o.Delta })
.Select(g => new { g.Key.Order, g.Key.Delta, Lines = g.Select(o => o.Line).ToList() });
免责声明:GroupByAdjacent函数来自我自己的宠物项目,未从任何地方复制.
内容总结
以上是互联网集市为您收集整理的c#-使用linq聚合文本文件内容,以便将它们分组全部内容,希望文章能够帮你解决c#-使用linq聚合文本文件内容,以便将它们分组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。