字符串.基于三级表达式的结果格式化

本文关键字:结果 格式化 表达式 于三级 字符串 | 更新日期: 2023-09-27 18:11:17

我有3个字符串,我想把它们放在一个标签上的3行。标签被填满了,需要一个固定的高度,所以我只希望每个字符串占用一行。也就是说,我希望每个字符串的长度保持在~20个字符。问题是,如果字符串是<20个字符,所以我需要在将其写入标签之前评估它是否存在。

我尝试的是:

mobPartLabel.Text = String.Format(
    "String 1: {0} 'nString 2: {1} 'nString 3: {2}", 
       (string1.Length >= 20 ? string1.Substring(0, 19) : string1), 
       (string2.Length >= 20 ? string2.Substring(0, 19) : string2), 
       (string3.Length >= 20 ? string3.Substring(0, 19) : string3));

显然,这不起作用。但这基本上是我想要实现的。请原谅我这个古怪的问题;我是第一次使用三级算符。我知道它们是什么,它们做什么,但是直到现在我还没有找到一个实现它们的理由>_>

有没有人对我在这里可能做错了什么有任何建议,或者如果这是完全不可能的,什么是更好的方法?

编辑使用此代码

            string string1 = "Rawr";
            string string2 = "Rawr2";
            string string3 = "Rawr3";
            mobPartLabel.Text = String.Format(
                "String 1: {0} 'nString 2: {1} 'nString 3: {2}",
                   (string1.Length >= 20 ? string1.Substring(0, 19) : string1),
                   (string2.Length >= 20 ? string2.Substring(0, 19) : string2),
                   (string3.Length >= 20 ? string3.Substring(0, 19) : string3));

我的标签上只写了"字符串1:",仅此而已。这是完整的标签。(

字符串.基于三级表达式的结果格式化

你的代码工作得很好。可能是带有标签本身属性/大小的东西。您是否将AutoSize属性设置为false?

同样,这可能会增加不必要的复杂性,因为您似乎是。net和c#的新手,但是使用LINQ扩展方法对string提供的Enumerable类型,我相信我们实际上可以进一步简化这一点,并进行以下更改。

using System.Linq;
{... other usings and namespace/type declarations ...}
        string string1 = "Rawr";
        string string2 = "Rawr2";
        string string3 = "Rawr3";
        mobPartLabel.Text = String.Format(
            "String 1: {0} 'nString 2: {1} 'nString 3: {2}",
               (string1.Take(20)),
               (string2.Take(20)),
               (string3.Take(20)));
可以说,使用Enumerable.Aggregate()可以使这更简单,但这段代码不适合介绍给您。这里重要的一点是,take方法并不是字符串类的自然组成部分,而是一个扩展方法Enumerable.Take(…),它是在类的设计密封之后添加的,为开发人员添加了额外的语法糖。

Linq扩展了几个BCL类型(最明显的是Enumerable)的扩展方法,旨在使用lambda表达式实现流畅的查询表达式。Linq不适合没有c#经验的胆小者使用,但它和lambda表达式一样正迅速变得司空见惯,因此尽早学会识别它们的用法是很重要的。当您理解委托、接口,特别是IEnumerable及其与c#语言的特殊关系(例如foreach和yield)时,您就可以认为自己已经准备好学习它们了