Хитрый здесь - Попытка пройти через цикл и вернуть значения только там, где их значения равны другому циклу - PullRequest
1 голос
/ 05 октября 2010

У меня проблема здесь, в основном.,

  • У меня есть цикл, в котором есть список сайтов, я прохожу каждый сайт.
  • У меня есть еще один цикл, который содержит только некоторые сайты
  • Я хочу вернуть только те сайты, где атрибут t.title == F.title
  • Если это правда, яхотите установить флажок
  • , если нет, не устанавливайте флажок

Проблема в том, что он создает больше флажков, чем я хочу, я хочу только те, где естьсовпадения отмечены - остальные не отмечены?

        foreach (Admin.DTO.SiteMap t in sites)
        {

            for each (Admin.DTO.SmallSites f in smallsites){

            if (t.Title == f.Title)
            {
                myString1.Append(" <input type='checkbox'  checked='yes' value='"     +           t.Title + "'/> ");
                myString1.Append(t.Title);
            }
            else {

                myString1.Append(" <input type='checkbox'  value='" + t.Title +        "'/> ");
                myString1.Append(t.Title);
            }

              } 
        }

Ответы [ 4 ]

1 голос
/ 05 октября 2010

Эти два цикла будут создавать флажки * smallsites сайтов. С одним из них проверено, многие не проверяют в остальных.

Это то, что тебе нужно?

foreach (Admin.DTO.SiteMap t in sites)
    {
        flg = false;
        for each (Admin.DTO.SmallSites f in smallsites)
            if (t.Title == f.Title) flg = true;
        if (flg)
        {
            myString1.Append(" <input type='checkbox'  checked='yes' value='"     +           t.Title + "'/> ");
            myString1.Append(t.Title);
        }
        else {

            myString1.Append(" <input type='checkbox'  value='" + t.Title +        "'/> ");
            myString1.Append(t.Title);
        }
    }
1 голос
/ 05 октября 2010

Если вы не хотите отображать непроверенные поля, удалите предложение else.

0 голосов
/ 05 октября 2010

Ваш код будет распечатывать содержимое smallsites n раз - где n - количество элементов в sites. Каждый раз, когда он печатает smallsites, он может поставить галочку в одном из полей.

Я предполагаю, что вы хотите сохранить внешний цикл таким, как он есть, но затем просто проверьте, содержится ли сайт в smallsites. Ответ от Pinichi даст правильный вывод, но, вероятно, весьма неэффективно. Не зная структуры SiteMap и SmallSites, я не могу предложить лучший метод.

0 голосов
/ 05 октября 2010

Калибр - ваша логика имеет недостатки выше.

в основном вы всегда сбрасываете каждый флажок каждый раз, когда проходите второй цикл, поэтому то, что было установлено в предыдущем цикле, вероятно, будет сброшено (и наоборот.Versa).как уже было отмечено, удалите раздел else (или предварительно инициализируйте значения в отдельном операторе)

[edit] - обновите с примером:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
    internal class Site
    {
        public string Title { get; set; }
        public string OtherStuff { get; set; }
        // don't know your site sturcture but this might help
    }
    class Program
    {
        static void Main(string[] args)
        {
            var siteMap =
                new List<Site>
                  {
                      new Site {OtherStuff = "bla1", Title = "Title 1"},
                      new Site {OtherStuff = "bla2", Title = "Title 2"},
                      new Site {OtherStuff = "bla3", Title = "Title 3"},
                      new Site {OtherStuff = "bla4", Title = "Title 4"},
                      new Site {OtherStuff = "bla5", Title = "Title 5"}
                  };
            var smallSites =
                new List<Site>
                  {
                      new Site {OtherStuff = "bla1", Title = "Title 1"},
                      new Site {OtherStuff = "bla2", Title = "Another title 2"},
                      new Site {OtherStuff = "bla3", Title = "Another title 3"},
                      new Site {OtherStuff = "bla4", Title = "Title 4"},
                      new Site {OtherStuff = "bla5", Title = "Another title 5"}
                  };

            // group all the matching titles to be checkboxed
            var query = (siteMap.Select(sm => 
                new {
                      sm.Title,
                      SmallSites = smallSites.Where(ss => ss.Title == sm.Title)
                  }));

            // get any items that don't match
            IEnumerable<Site> query2 =
                smallSites.Where(ss => !(siteMap.Select(sm => sm.Title))
                                           .Contains(ss.Title));

            string myString1 = "";
            // this is our checkbox items, do those 1st
            foreach (var item in query)
            {
                if (item.SmallSites.Any())
                {
                    foreach (var smallSite in item.SmallSites)
                    {
                        myString1 += string.Format("<input type='checkbox'  checked='yes' value='{0}'", smallSite.Title) + Environment.NewLine;
                    }
                }
            }

            // now throw down our non-checked items
            foreach (var smallSite in query2)
            {
                myString1 += string.Format("<input type='checkbox' value='{0}'", smallSite.Title) + Environment.NewLine;
            }
            Console.Write(myString1);
            Console.Read();
        }
    }
}

вы, конечно, можетедобавляйте каждый из этих двух элементов в новый список (т.е. вместо добавления к myString1) по мере продвижения вперед, а затем сортируйте окончательный список по своему усмотрению, а затем выкладывайте его так, как вам нужно в конце.

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...