c# - 如何从每次运行的相似项目中选择最后一个值?

标签 c# .net linq ienumerable

我有一个 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/

相关文章:

c# - WPF:如何在 UI 线程中进行异步调用

c# - 如何使用 dll 作为不同机器的加载项?

C# - 基类中的调用方法

java - 计算差异顺便说一句。不同地点/时区的时间(考虑夏令时)

c# - 使用 Linq 在 C# 中进行列表操作

c# - if 语句中的 And & Or 运算符

c# - 如何对加载到内存中的可执行文件进行 CRC 检查?

c# - Linq 按多列分组并在 group by 子句之前从表中获取额外值

c# - 将定界转换为固定宽度的最佳方法

c# - Sitecore - 以编程方式修改模板的源字段