【问题标题】:Compare item to list of items, excluding the item being compared将项目与项目列表进行比较,不包括正在比较的项目
【发布时间】:2013-08-22 15:30:52
【问题描述】:

我有一个项目列表,可以说 | 1 | 2 | 3 | 4 | 5 |我想取 1 并将其与列表的其余部分进行比较,但我不希望 1 与自身进行比较。在 1 与列表的其余部分进行比较后,我想将 1 弹出回列表中,然后取出 2 并这次与列表的其余部分进行比较,包括 1。这就是我尝试过的。这里的问题是,当我第一次迭代它时它工作得很好,因为第一次迭代从 0 开始并从 1 开始进行比较,但是一旦它循环超过 0 索引,它将开始与它进行比较,从而导致问题。任何帮助都是极好的。我知道这只是我必须弄清楚的逻辑问题,但我有点迷失了。

这是我尝试过的

        if (RadUpload1.UploadedFiles.Count > 1)
    {
        for (int fileBuffer = 0; fileBuffer < RadUpload1.UploadedFiles.Count; fileBuffer++)
        {
            for (int fileList = 1; fileList < RadUpload1.UploadedFiles.Count; fileList++)
            {
                if (RadUpload1.UploadedFiles[fileBuffer] != RadUpload1.UploadedFiles[fileList])
                {
                    if (RadUpload1.UploadedFiles[fileBuffer].GetName() == RadUpload1.UploadedFiles[fileList].GetName())
                    {
                        lbl_message.Text = "There where duplicates files found please check the files and try again";
                    }
                    else
                    {
                      //do other stuffs
                    }

【问题讨论】:

    标签: c# list loops logic


    【解决方案1】:
    if (RadUpload1.UploadedFiles.Count > 1)
    {
        for (int fileBuffer = 0; fileBuffer < RadUpload1.UploadedFiles.Count-1; fileBuffer++)
        {
            for (int fileList = fileBuffer + 1; fileList < RadUpload1.UploadedFiles.Count; fileList++)
            {
                if (RadUpload1.UploadedFiles[fileBuffer] != RadUpload1.UploadedFiles[fileList])
                {
    //....
    

    【讨论】:

    • 现在检查一下。我会让你知道它是如何工作的并标记为已回答。感谢您的快速回复^_^
    • 我需要完成的是 1 被拉出并检查其余项目,然后 2 被拉出并检查其余项目(包括 1)| 1 | 2 | 3 | 4 | 5 | .所以就像我拉出 1 并与 2345 比较然后我拉出 2 并与 1345 然后比较 3 并比较 1245 然后 4 并比较 1235 然后 5 并比较 1234。目前这种方法不检查我仍然想要的最后一项预成型。即使通过列表它已经检查了所有项目,我仍然希望最后一个项目也检查其余项目。
    • @NitroFrost 在第一个循环中,1 已经与 2 进行了比较,但您仍然在第二个循环中再次比较它们?这很奇怪。
    • 是的,我同意。我现在正在讨论我的逻辑。我想我修好了。如果最后一个项目已经与所有可能的项目进行了比较,我为什么还要比较它。
    • 在进行比较后,我检查并修复了我正在做的事情的逻辑,它运行良好。我最终做的是我创建了一个 int buffer = 0;并且当它循环比较时,如果它发现一个比较它只是添加到该 int 并中断,然后转到另一个条件检查缓冲区设置为,如果它 = 0,那么它将执行逻辑,如果不是它将结束函数并显示错误。我非常感谢您的帮助
    【解决方案2】:

    我知道这不是使用您的代码,而是将每个项目与每个项目进行比较的简单概念,但它本身就在那里,祝你好运。

    def search(alist):
        for anitem in alist:
            for anotheritem in alist:
                if alist.index(anitem) == alist.index(anotheritem):
                    pass
                else:
                    Do something
    

    【讨论】:

      【解决方案3】:

      所以您想查找重复项? LINQ 会大大简化它:

      var list = new List<int> { 1, 2, 3, 4, 5 };
      var dups = list.GroupBy(i => i).Where(g => g.Count() > 1);
      foreach (var dup in dups)
      {
          int i = dup.Key;
          int count = dup.Count();
      }
      

      这也适用于您的UploadedFileCollection(在Cast 的帮助下,因为它只实现了非泛型CollectionBase 类):

      var dupFiles = uploadedFiles.Cast<UploadedFile>()
          .GroupBy(f => f.GetName())
          .Where(g => g.Count() > 1);
      foreach (var dupFile in dupFiles)
      {
          string fileName = dupFile.Key;
          int count = dupFile.Count();
      }
      

      【讨论】:

      • 感谢蒂姆抽出时间回答。我没有对 LINQ 做过任何工作,但我会仔细看看你在这里展示的内容,看看我能用它做什么。这个例子看起来真的可以帮助我清理我的代码和使用更好的实践。我有很多学习要做,感谢您将我需要查找的内容添加到我的列表中。再次感谢。
      【解决方案4】:

      如果要从列表中删除和添加项目,您可以使用 Object.ReferenceEquals 来了解它是否是同一个 File 实例:

      试试这个代码:

      class Program
      {
          static void Main(string[] args)
          {
      
              List<File> FileList = new List<File>();
              FileList.Add(new File { FullPath = "File1" });
              FileList.Add(new File { FullPath = "File2" });
              FileList.Add(new File { FullPath = "File3" });
              FileList.Add(new File { FullPath = "File4" });
              FileList.Add(new File { FullPath = "File5" });
              //FileList.Add(new FileName { FullPath = "File5" });
      
              foreach (File SourceFile in FileList) 
              {
                  foreach (File TestFile in FileList) 
                  {
                      if (SourceFile.GetName() == TestFile.GetName() && !(Object.ReferenceEquals(SourceFile, TestFile)))
                      {
                          var lbl_message = "There where duplicates files found please check the files and try again";
                      }
                      else 
                      {
                          //another stuff
                      }
                  }                    
              }
          }
      }
      
      public class File
      {
          public string FullPath;
      
          public string GetName()
          {
              return FullPath;
          }
      }
      

      【讨论】:

      • 我将不得不更多地探索 Object.ReferenceEquals。不过感谢这个例子。
      【解决方案5】:

      您也可以为此使用 linq 查询:

          var duplicatesFiles = from file in FileList 
                           group file by file.GetName() into groupedbyname
                           where groupedbyname.Count() > 1
                           select groupedbyname.Count();
      
          bool thereAreDuplicates = duplicatesFiles.Count() > 0;
      

      【讨论】:

        猜你喜欢
        • 2020-10-16
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多