C# 无重复循环的有效循环方法

C# 无重复循环的有效循环方法,c#,C#,我有一个生成文件的任务,所以这是数据示例(来自excel) 我想要的是当你已经找到相同的数据时,例如:第一行是Enr,第五行是Enr,如果你已经循环第一行并找到相同的数据(第五行),我不希望当变量int i=4时,它会再次循环A Enr来搜索相同的数据,因为它已经从i=0开始搜索了(哪一个是第一行的A ENR) 如何有效地执行循环,因为如果使用for语句,第5(A)行将被循环回以检查相同的数据,这是我不想要的,因为第1(A)行已循环并在第5行中找到相同的数据 代码示例 for (int i =

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

我想要的是当你已经找到相同的数据时,例如:第一行是Enr,第五行是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]);
                                }
                            }
                        }
                    }
            }
for(int i=0;i

注意:sry语法不好,我正在努力提高我的英语水平。

尝试声明一个int/bool数组,其大小根据您的不同元素而定(在本例中可能为22), 现在,每一行增加与您看到的后一行相对应的单元格(例如[x-'a']++),并且只有当对应的单元格为0时,才在每一行上执行内部循环


因此,基本上只要在看到一个字符时进行标记,这样下次看到它时,您就会知道您已经看到了一个字符。

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

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);
    }
}
stringpath=@“C:\Some\Text\File.txt”;
List outputValues=新列表
{
“Enr”,
“B CD”,
“C Cdr”,
“D Der”,
“Enr”,
“B CD”
};
List foundValues=新列表();
foreach(outputValues中的字符串outputValue)
{
if(foundValues.Contains(outputValue))
continue;//不输出此输出值两次
foundValues.Add(outputValue);
正在使用(StreamWriter sw=File.Exists(path)?File.AppendText(path):File.CreateText(path))
{
软件写入线(输出值);
}
}

它是linq、group by、tuple,听起来你很熟悉,为什么不试试
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);
}

//假设索引是A,B,C,D
//假设值为Enr,Cds
var结果=datas.GroupBy(x=>(x.index,x.value));
使用foreach然后打印密钥,现在i分组中的密钥类似于Tuple。
Item1是索引,Item2是值。
foreach(result.ToList()中的var项)
{
写(item.Key.Item1);
something.WriteLine(item.Key.Item2);
}

显示一些代码?我们不知道您在循环什么over@KeithNicholas等等,我先发布一个更优雅的解决方案,它会在foreach循环之外的using块中创建StreamWriter一次。这个解决方案远没有效果,因为它的复杂性是O(n^2)如果您使用哈希表来记录所发现的内容,则效率会更高。
// 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);
}