有效的循环方式,无需重复循环

时间:2019-10-14 02:25:38

标签: c#

我有一个生成文件的任务,所以这是数据示例(来自excel)

A Enr
B Cds
C Cdr
D Der
A Enr
B Cds

我想要的是当您已经找到相同的数据时,例如:如果您已经循环第一行并找到相同的数据(第五行),则第一行是A Enr,第五行是A Enr。 ,我不希望当变量int i = 4时,它将再次循环A Enr来搜索相同的数据,因为它已经从i = 0(第一行中的A ENR)开始搜索

如何有效地执行循环,因为如果使用for语句,则第5行(A)将循环返回以检查相同的数据,这就是我不想要的东西,因为在第1行(A )已循环并在第5行中找到了相同的数据。

代码示例

for (int i = 0; i < row; i++)
            {
                    for(int k = 0 ; k < row ;k++)
                    {
                        if (fulldatadetail[i][0] == fulldatadetail[k][0])
                        {
                            if (!File.Exists(path))
                            {
                                using (StreamWriter sw = File.CreateText(path))
                                {
                                    sw.WriteLine(fulldatadetail[i][0]);
                                }
                            }
                            else if (File.Exists(path))
                            {
                                using (StreamWriter sw = File.AppendText(path))
                                {
                                    sw.WriteLine(fulldatadetail[i][0]);
                                }
                            }
                        }
                    }
            }

P.S:对语法不好很抱歉,我正在努力提高我的英语水平..

3 个答案:

答案 0 :(得分:0)

linq,分组依据,元组听起来很耳熟,为什么不尝试GroupBy

// assume index is A,B,C,D
// assume value is Enr,Cds

var result = datas.GroupBy(x=> (x.index, x.value));

use foreach then print your key, your key in IGrouping<T> now is something like Tuple. 
Item1 is index, Item2 is value.

foreach(var item in result.ToList())
{
  something.Write(item.Key.Item1);
  something.WriteLine(item.Key.Item2);
}

答案 1 :(得分:-1)

尝试根据您的不同元素声明一个大小为int / bool的数组(在本示例中为22), 现在,每一行都会增加与您看到的后者相对应的单元格(例如a [x-'A'] ++),并且在每一行上,仅当相应的单元格为0时才进行内部循环。

基本上,只要看到一个字符就作标记,以便下次看到该字符时就知道已经看到了一个字符。

答案 2 :(得分:-1)

假设您要省略重复的数据行,并且唯一需要检查的是行数完全相等(而不仅仅是基于第一个字符),此代码可能会对您有所帮助。它会跟踪列表中的每个找到的值,如果以前已经输出过,则会跳过输出。

string path = @"C:\Some\Text\File.txt";
List<string> outputValues = new List<string>
{
    "A Enr",
    "B Cds",
    "C Cdr",
    "D Der",
    "A Enr",
    "B Cds"
};

List<string> foundValues = new List<string>();

foreach (string outputValue in outputValues)
{
    if (foundValues.Contains(outputValue))
        continue; // Doesn't output this output value twice

    foundValues.Add(outputValue);
    using (StreamWriter sw = File.Exists(path) ? File.AppendText(path) : File.CreateText(path))
    {
        sw.WriteLine(outputValue);
    }
}