我有一个 list 。我想从每次运行的相似元素中获取最后一个值。
我是什么意思?让我举一个简单的例子。给定单词列表
['golf', 'hip', 'hop', 'hotel', 'grass', 'world', 'wee']
和“以相同字母开头”的相似函数,该函数将返回较短的列表
['golf', 'hotel', 'grass', 'wee']
为什么?原始列表有 1 组 G 词、3 组 H 词、1 组 G 词和 2 组 W 词。该函数返回每次运行的最后一个单词。
我该怎么做?
假设的 C# 语法(实际上我正在处理客户对象,但我想分享一些你可以自己运行和测试的东西)
> var words = new List<string>{"golf", "hip", "hop", "hotel", "grass", "world", "wee"};
> words.LastDistinct(x => x[0])
["golf", "hotel", "grass", "wee"]
编辑:我尝试了 .GroupBy(x => x[0]).Select(g => g.Last())
但是这给出了 ['grass',
'hotel', 'wee'] 这不是我想要的。仔细阅读示例。
编辑。另一个例子。
['apples', 'armies', 'black', 'beer', 'bastion', 'cat', 'cart', 'able', 'art', 'bark']
这里有 5 次运行(A 的运行,B 的运行,C 的运行,A 的新运行,B 的新运行) .每次运行的最后一句话是:
['armies', 'bastion', 'cart', 'art', 'bark']
需要了解的重要一点是每次运行都是独立的。不要混淆开头的 A 和接近尾声的 A。
最佳答案
用老式的方法做没有什么太复杂的:
Func<string, object> groupingFunction = s => s.Substring(0, 1);
IEnumerable<string> input = new List<string>() {"golf", "hip", "..." };
var output = new List<string>();
if (!input.Any())
{
return output;
}
var lastItem = input.First();
var lastKey = groupingFunction(lastItem);
foreach (var currentItem in input.Skip(1))
{
var currentKey = groupingFunction(str);
if (!currentKey.Equals(lastKey))
{
output.Add(lastItem);
}
lastKey = currentKey;
lastItem = currentItem;
}
output.Add(lastItem);
你也可以把它变成一个通用的扩展方法,如 Tim Schmelter has done ;我已经采取了几个步骤来有意概括代码(使用 object
作为键类型,使用 IEnumerable<T>
作为输入类型)。
关于c# - 如何从每次运行的相似项目中选择最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240827/