为了账号安全,请及时绑定邮箱和手机立即绑定

将多个属性的 CSV 和 concat 后缀拆分为一个列表

将多个属性的 CSV 和 concat 后缀拆分为一个列表

C#
慕的地8271018 2022-11-21 21:10:08
我有三个格式为 CSV 的字符串属性:string Tap70V = "1,2,3,4" //example datastring Tap100V = "10,20,30,40" //example datastring Tap25V = ".2,.4,.6,.8" //example data我想要列表中的以下结果,以便我可以将它绑定到组合框:".2 Watt 25V"".4 Watt 25V"".6 Watt 25V"".8 Watt 25V""1 Watt 70V""2 Watt 70V""3 Watt 70V"等等,直到它显示"4 Watt 100V"我知道我需要将这三个属性结合在一起,用“,”将它们拆分成一个列表,然后连接后缀“Watt XXV”。(不一定按这个顺序)我只是想不出一个好的一两行方法来做到这一点
查看完整描述

4 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

首先,您应该将变量的值移动到如下所示的字典结构中


var tbl = new Dictionary<string, string>() {

    { "70V", "1,2,3,4" },

    { "100V", "10,20,30,40" },

    { "25V", ".2,.4,.6,.8" },

};

然后您可以使用以下代码轻松查询它


tbl.SelectMany(x => x.Value.Split(',').Select(y => $"{y} Watt {x.Key}"));

该SelectMany调用展平了多层层次结构,并返回IEnumerable<string>带有所需字符串的 。对于内插字符串的$"{y}"语法,如果您不使用受支持的 C# 版本,则可以使用string.Format而不是字符串内插


更新


根据 OP 的评论,我提供了一种形成上面字典的方法


var tbl = new Dictionary<string, string>() {

    { nameof(Tap70V), Tap70V },

    { nameof(Tap100V), Tap100V },

    { nameof(Tap25V), Tap25V },

};

依赖变量名来获取值是一种危险的做法。如果 OP 提供了 和 的值如何可用70V,那么我可以用合适的方式更新答案以使其适应该解决方案100V25V


查看完整回答
反对 回复 2022-11-21
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

问题是:你怎么知道值的范围与 70V 有关,而值的范围与 25V 有关?


但让我们假设您有一系列电压文本组合:


Voltage | Text

   70   | "1,2,3,4"

  100   | "10,20,30,40"

   25   | ".2,.4,.6,.8"

例如,从您的三个变量创建它们:


IEnumerable<VoltageTextCombination> voltageTextCombinations = new VoltageTextCombination[]

{

    new VoltageTextCombination {Voltage =  70, Text = Tap70V},

    new VoltageTextCombination {Voltage = 100, Text = Tap100V},

    new VoltageTextCombination {Voltage =  25, Text = Tap25V},

}

我为此定义了一个类 VoltageTextCombination。当然,您也可以为此使用匿名类型。


要获得您的组合框项目序列,您需要将文本拆分为一系列瓦特,并使用正确的SelectMany 重载来获得一系列电压 - 瓦特组合。之后,您使用 String.Format 将每个电压 - 瓦特组合转换为您想要显示的文本:


下面的 LINQ 中使用的常量,用于将输入文本拆分为瓦特,并将电压 - 瓦特组合格式化为字符串:


static readonly char[] separatorChars = new char[] {','};

const string strFormat ="{0} Watt {1}V";

LINQ 查询:


var result = voltageTextCombinations.SelectMany(


    // parameter collectionSelector:

    // input a source element (= one voltageTextCombination)

    // output a sequence (= the text of the combination split into Watts

    combination => combination.Text.Split(separatorChars),


    // parameter resultSelector: take one source element, and one of every watt

    // to make a Voltage - Watt combination

    (voltageTextCombi, splitString) => new

    {

        Voltage = voltageTextCombi.Voltage,

        Watt = splitString,

    })


    // convert every Voltage-Watt combination to one string:

    .Select(voltageWattCombi => String.Format(strFormat,

            voltageWattCombi.Watt,

            voltageWattCombi.Voltage));

非常简单!


查看完整回答
反对 回复 2022-11-21
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

这是我能想到的最干净的方法来完成我的问题:


if (value is IItemLibrarySpeaker s)

        {

            List<string> taps = s.Speaker25VTaps.Split(',').Select(x => $"{x} Watt/25V").ToList();

            taps.AddRange(s.Speaker70VTaps.Split(',').Select(x => $"{x} Watt/70V"));

            taps.AddRange(s.Speaker100VTaps.Split(',').Select(x => $"{x} Watt/100V"));


            return taps;

        }

感谢您的建议(即使是与我的问题无关的建议)


查看完整回答
反对 回复 2022-11-21
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

根据提供的示例数据,我制作了如下示例代码:


string Tap70V = "1,2,3,4"; //example data

            string Tap100V = "10,20,30,40"; //example data

            string Tap25V = ".2,.4,.6,.8"; //example data


            var test = new List<string>();

                test.AddRange(Tap70V.Split(',').Select(val => val + " Watt 70V"));

                test.AddRange(Tap100V.Split(',').Select(val => val + " Watt 100V"));

                test.AddRange(Tap25V.Split(',').Select(val => val + " Watt 25V"));

在上面的代码中,将字符串对象值添加到List<string>变量 namedtest中。对于每个对象数据都需要拆分并添加范围到列表中。


查看完整回答
反对 回复 2022-11-21
  • 4 回答
  • 0 关注
  • 231 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号