微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#-当数据内容随机且长度未知时,从数组中选择数据

如何解决C#-当数据内容随机且长度未知时,从数组中选择数据

所以我写了一些代码,并被告知以这种方式编写它是糟糕的形式。

所以希望有人可以指出我的更好方法。我的代码

string phrase = Value.Text;
List<string> wordList = new List<string>();
string words = phrase.Split('\t','\r');

int Three = 3;
int Two = 2;
int One = 1;
int Four = 4;
int Five = 5;
int Six = 6;

for (int i = 0; i < result; i = i + 12,Three = Three + 12,Two = Two + 12,One = One + 12,Four = Four + 12,Five = Five + 12,Six = Six + 12)
{
wordList.Add(ID.Text + '\t');
wordList.Add(IT.Text + '\t');
wordList.Add(words[Three] + '\t');
wordList.Add(words[Two] + '\t');
wordList.Add(PD.Text + '\t');
....etc.
}

令人讨厌的部分是这个

for (int i = 0; i < result; i = i + 12,Six = Six + 12)

我明白为什么,它很丑陋而且很长,也许是不必要的吗?

要做什么?

我有一个完全随机的数据(短语)数组。

数据以12组为一组输入,但是可以输入多个数据组,但总是可以被12整除-因此12、24、36。我不知道在任何给定点将输入多少数据,但我知道它将被12整除。

有时是单词,有时是数字-我事先不知道会是什么,它们不是日子,不是年龄,我无法为数组中的数据点指定元素。它们的字符长度将有所不同,它们在每个数据集中的不同位置将具有不同的标点符号。所有数据都由一个制表符分隔。

从12的列表中,我需要拉3、2、1、4、5、6。

按此顺序。然后,我将该数据放入List 中,并输出数据以及一些文本框以匹配指定的格式。

代码用途

遍历12组中的数据,直到没有更多数据为止。

每个循环从数组中提取一个数据点,例如第3、15、27、39等。

每个循环从word数组添加数据,在各个位置添加TextBoxes,然后将其编译为List。然后生成列表,以供用户通过一次操作将其复制为指定的格式。

我想到了“整数3 = 3”;为了能够使每个循环增加12个数字。我想不出其他任何方式。

但是要在这里学习,所以,如果您知道应该怎么做-即使您只是想指出我应该做的事情,我也会全神贯注。

如果您需要一个数据示例,请用手指掌键盘12次,在每个键盘之间放置一个制表符...您将对数据的含义有所了解-我绝对没有提供一个示例,这是无意义的乱码,唯一一致的因素是每个分组之间的Tab键。

解决方法

想发表评论-这是一个实现我之前概述的预期解决方案。它将输入分成12个长度的块,并创建一个临时的单词集集合,这些单词集可用于您需要的任何目的,并带有解释其工作原理的注释。

void Main()
{
    int demoDataSetCount = 10;
    int chunkSize=12;
    //create some test data as a multiple of the chunk size
    var inputData = string.Join(Environment.NewLine,Enumerable.Range(0,demoDataSetCount * chunkSize)
        .Select(e => string.Join("\t",Enumerable.Range(e,chunkSize))));
    
    //call the extension method
    var wordSets = inputData.GenerateWordSets(chunkSize);
    
    //loop over the resulting collection
    foreach(var wordSet in wordSets)
    {
        //get the various interesting items by index
        var three=wordSet.Values.ElementAt(2);
        var two=wordSet.Values.ElementAt(1);
        var one=wordSet.Values.ElementAt(0);
        var four=wordSet.Values.ElementAt(3);
        var five=wordSet.Values.ElementAt(4);
        var six=wordSet.Values.ElementAt(5);

        //write to console demo'ing output
        Console.WriteLine($"Index: {wordSet.Index}{Environment.NewLine}\tThree: {three}{Environment.NewLine}\tTwo: {two}{Environment.NewLine}\tOne: {one}{Environment.NewLine}\tFour: {four}{Environment.NewLine}\tFive: {five}{Environment.NewLine}\tSix: {six}");
    }
}

//used to hold the intermediate output,one set of words per chunk size
public sealed class WordSet
{
    public int Index { get; set; }
    public IEnumerable<string> Values { get; set; }
}

public static class Extensions
{
    //various optional parameters to tweak behavior
    public static IEnumerable<WordSet> GenerateWordSets(this string input,int chunkSize=12,int interestingRangeStart=0,int interestingRangeLength=6)
    {
        //split the input on new line and tabs
        var words = input.Split(new string[] { Environment.NewLine,"\t" },StringSplitOptions.None);
        //generate a range of ints to group with
        return Enumerable.Range(0,words.Length)
            //int rounding used to group into chunks
            //get the words from the current index
            .GroupBy(k => k / chunkSize,k=> words[k])
            //project grouping into a WordSet collection
            .Select(g => new WordSet 
            { 
                Index = g.Key,//take only the indexes we are interested in reading
                Values = g.Skip(interestingRangeStart).Take(interestingRangeLength) 
            });
    }
}

有关此处如何进行分组的更多信息,请参见https://stackoverflow.com/a/1008974/426894

输入如下:

0 1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12 13
....

生成如下输出:

Index: 0
  Three: 2
  Two: 1
  One: 0
  Four: 3
  Five: 4
  Six: 5
Index: 1
  Three: 3
  Two: 2
  One: 1
  Four: 4
  Five: 5
  Six: 6
Index: 2
  Three: 4
  Two: 3
  One: 2
  Four: 5
  Five: 6
  Six: 7
....

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。