sve*_*vit 6 .net c# linq dictionary list
我有一个字符串列表,我想将其转换为某种分组列表,其中值将按列表中的位置进行分组(不是正常分组,但在某种程度上,相同的项目只在一个组中如果他们在一起).请考虑以下示例:
LinkedList<string> myList = new LinkedList<string>();
myList.AddLast("aaa");
myList.AddLast("aaa");
myList.AddLast("bbb");
myList.AddLast("bbb");
myList.AddLast("aaa");
myList.AddLast("aaa");
myList.AddLast("aaa");
LinkedList<MyTuple> groupedList = new LinkedList<MyTuple>();
groupedList.AddLast(new MyTuple("aaa", 2));
groupedList.AddLast(new MyTuple("bbb", 2));
groupedList.AddLast(new MyTuple("aaa", 3));
Run Code Online (Sandbox Code Playgroud)
这个转换可以用LINQ完成,还是应该用循环编写算法?
这个答案中的扩展方法几乎可以满足您的要求(微软还提供了一个实现来按顺序对连续项目进行分组):
public static IEnumerable<IGrouping<int, T>>
GroupConsecutive<T>(this IEnumerable<T> set, Func<T, T, bool> predicate)
{
var i = 0;
var k = 0;
var ranges = from e in set
let idx = ++i
let next = set.ElementAtOrDefault(idx)
let key = (predicate(e, next)) ? k : k++
group e by key into g
select g;
return ranges;
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用它:
void Main()
{
LinkedList<string> myList = new LinkedList<string>();
myList.AddLast("aaa");
myList.AddLast("aaa");
myList.AddLast("bbb");
myList.AddLast("bbb");
myList.AddLast("aaa");
myList.AddLast("aaa");
myList.AddLast("aaa");
IGrouping<int,string> ggg;
var groups=myList.GroupConsecutive((a,b)=>a==b);
ILookup<string,int> lookup=groups.ToLookup(g=>g.First(),g=>g.Count());
foreach(var x in lookup["aaa"])
{
Console.WriteLine(x); //outputs 2 then 3
}
foreach(var x in lookup["bbb"])
{
Console.WriteLine(x); //outputs 2
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,最终容器是一个ILookup,其行为有点像字典,但允许针对单个键存储多个值。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |