2013-05-05 155 views
2

在Visual C#中,如何检测Session中是否存在数组?该网站有一个文本框,你可以写一个名字。当您点击“点击”按钮时,它会在标签中添加名称。假设我添加了相同的名称,并且它应该在标签中显示一条消息,如“名称已存在!”。我该怎么办?我阅读了“包含”方法,但对我来说效果不佳。我犯了什么错误?检查数组是否已经存在于会话中

下面的代码是:

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'类是做什么的? – 2013-05-05 11:31:37

+0

我想保留多一个名字。字符类仅仅是这样的:public class Character { public string name {get;组; } } – Rider 2013-05-05 11:38:08

+0

我这种情况下,我会建议你会读我的答案的第二部分,并与'列表'去。 – 2013-05-05 11:40:56

回答

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 2013-05-05 12:01:17

+0

如果我在我的Character类中有第二个叫做“age”的声明,那么还有什么要做的呢:public int age {get;组; }如何显示两个(姓名和年龄)?尝试一些事情,但它显示我一个错误: System.Collections.Generic.HashSet'1 [System.String] System.Collections.Generic.HashSet'1 [System.Int32] – Rider 2013-05-05 13:38:02

-1

只需点击会话是否为空。您可以使用字符串对象的IsNullOrEmpty函数。

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

虽然在Stackoverflow上也有类似的问题。

+0

-1:现在你正在检查会话类型字符串内是否有值。但是由于OP使用'List ',你的情况总是会导致'False'。 – 2013-05-05 11:29:39

+0

是的。 OP的问题还不够清楚。 – iab 2013-05-05 11:31:39

0

实体:

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 

编辑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); 
    } 
} 
相关问题