2013-05-05 2 views
2

В Visual C#, как определить, существует ли массив в сеансе? На сайте есть TextBox, вы можете написать имя. Когда вы нажимаете кнопку «Click», она добавляет имя в ярлык. Предположим, я добавляю одно и то же имя, и он должен показать мне сообщение в ярлыке, например «Имя уже существует!». Что мне делать? Я читал о методе «содержит», но не работал так хорошо для меня. Какую ошибку я делаю?Проверить, существует ли массив в сеансе

Следующий код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    protected void btnClick_Click(object sender, EventArgs e) 
    { 
     if (Session["listOfCharacters"] == null) 
     { 
      Session.Add("listOfCharacters", new List<Character>()); 
     } 

     List<Character> listOfCharacters = (List<Character>)Session["listOfCharacters"]; 

     listOfCharacters.Add(new Character() { name = txtName.Text}); 

     lblShow.Text = ""; 

     foreach (Character item in listOfCharacters) 
     { 
      lblShow.Text += "Name: " + item.name + "<br />"; 

     //if (listOfCharacters.Contains(Session["listOfCharacters"])) 
     //{ 
     // lblShow.Text = "Exists"; 
     //} 
     } 
    } 
} 

Поверьте, это заняло у меня часы и дни, но не нашли решение еще.

+0

Сколько имен вы хотите сохранить в своей сессии? Всего 1 (последний) или больше? И что делает класс 'Character'? –

+0

Я хочу сохранить более одного имени. Класс символов - это просто: public class Character { public string name {get; задавать; } } – Rider

+0

В этом случае я бы посоветовал вам прочитать вторую часть моего ответа и перейти к «списку ». –

ответ

1

вы можете написать LINQ запрос для проверки, если элемент существует в списке

например

private string _listofcharacters = "listOfCharacters"; 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (Session[_listofcharacters] == null) 
    { 
     Session.Add(_listofcharacters, new List<Character>()); 
    } 

    List<Character> listOfCharacters = (List<Character>)Session[_listofcharacters]; 

    lblShow.Text = ""; 

    var check = from p in listOfCharacters 
       where p.Name.ToLower().Contains(txtName.Text.ToLower()) 
       select p; 

    if (check.Count() == 0) 
    { 
     listOfCharacters.Add(new Character() { Name = txtName.Text }); 

     foreach (Character item in listOfCharacters) 
     { 
      lblShow.Text += "Name: " + item.Name + "<br />"; 
     } 
    } 
    else 
    { 
     lblShow.Text = "Name already exists!"; 
    } 
} 
0

Уу нужно повторить в своем списке и посмотреть на свойство name символа - то же, что и новый текст в текстовом поле. Вы можете использовать LINQ:

if (listOfCharacters.Any(c => c.name == txtName.Text)) 
    lblShow.Text = "Name already exists!"; 

Если вы использовали List<string>, то было бы проще, потому что, чем вы могли бы просто использовать Contains метод, как это:

List<string> listOfCharacters = ... 
.... 
if (listOfCharacters.Contains(txtName.Text)) 
    lblShow.Text = "Name already exists!"; 

Для дополнительной производительности, нет не использовать List<string> но HashSet<string>.

Итак, если у вас есть класс символов, чтобы содержать имя, я бы предложил: потерять класс и пойти с List<string>.

Ваш код будет затем стать:

protected void btnClick_Click(object sender, EventArgs e) 
{ 
    List<string> listOfNames = Session["listOfNames"] as List<string>; 
    if (listOfNames == null) 
     Session["listOfNames"] = listOfNames = new List<string>(); 

    if (listOfNames.Contains(txtName.Text)) 
    { 
     lblShow.Text = "Name already exists!"; 
    } 
    else 
    { 
     listOfNames.Add(txtName.Text); 
     lblShow.Text = String.Join("<br />", listOfNames); 
    } 
} 
+0

Спасибо вам большое! Тратить часы и дни без результата было действительно болью. Глубоко цените ваши и всякие помочь :) – Rider

+0

Что еще нужно сделать, если у меня есть второе объявление под названием «age» в моем классе Character ?: public int age {get; задавать; } Как я могу отобразить оба (имя и возраст)? Попробуйте несколько вещей, но это показывает мне ошибку: System.Collections.Generic.HashSet'1 [System.String] System.Collections.Generic.HashSet'1 [System.Int32] – Rider

-1

Просто проверить, если сеанс Null или Empty. Вы можете использовать функцию IsNullOrEmpty для строкового объекта.

if(!string.IsNullOrEmpty(Session["listOfCharacters"] as string)){ 
      lblShow.Text = "Exists"; 
    } 

Есть похожие вопросы к Stackoverflow.

+0

-1: Теперь вы проверяют, есть ли значение внутри сеанса строки типа. Но поскольку OP использует «Список », ваше условие всегда приведет к «False». –

+0

Правда. Вопрос ОП был недостаточно ясен. – iab

0

Entity:

public class Character 
{ 
    public string Name; 
} 

Comparer

public class CharacterComparer : IEqualityComparer<Character> 
{ 
    public bool Equals(Character x, Character y) 
    { 
     if (ReferenceEquals(x, y)) 
     { 
      return true; 
     } 

     if (ReferenceEquals(x, null) || ReferenceEquals(y, null)) 
     { 
      return false; 
     } 

     // Ignore case and culture 
     return string.Compare(x.Name, y.Name, StringComparison.InvariantCultureIgnoreCase) == 0; 
    } 

    public int GetHashCode(Character obj) 
    { 
     if (obj == null || string.IsNullOrEmpty(obj.Name)) 
     { 
      return 0; 
     } 

     return obj.Name.GetHashCode(); 
    } 
} 

использование HashSet.

 HashSet<Character> characters1 = new HashSet<Character>(new CharacterComparer()); 
     characters1.Add(new Character {Name = "Alex"}); 
     characters1.Add(new Character { Name = "Peter" }); 
     characters1.Add(new Character { Name = "John" }); 

     HashSet<Character> characters2 = new HashSet<Character>(new CharacterComparer()); 
     characters2.Add(new Character { Name = "John" }); 
     characters2.Add(new Character { Name = "Jenny" }); 

     characters2.IntersectWith(characters1); 

     Console.WriteLine("Existing count: " + characters2.Count); 

Выход:

Existing count: 1 

EDIT 1

не добавить новый пункт в списке сеанса:

listOfCharacters.Add(new Character() { name = txtName.Text}); 

ужедобавленный новый персонаж в список а затем пытается найти его в том же списке. Вы должны использовать отдельные списки. Список сессий (существующие символы) и новый список с символами, которые нужно добавить.

добавить

using System.Linq; 

и перебирать новый список для поиска существующих пользователей в списке сеанса

// characters2 = created new list with Characters to be added 
foreach (var item in characters2) 
{ 
    Character character = item; 
    // characters1 = obtained from sessions 
    bool contains = characters1.Contains(character, new CharacterComparer()); 
    if (contains) 
    { 
     Console.WriteLine("Character {0} exists", character.Name); 
    } 
} 
Смежные вопросы