首页 > 解决方案 > 如何重写代码以将匿名类型分配给列表框

问题描述

有人可以帮我重新编写以下代码吗?我需要同时拥有 groupId 和 groupName 来设置列表框的数据字段。

if (categoryId == null)
                {
                    var groups = usersData.Where(g => g.groupName != null).Select(g => new { groupId = g.groupId, groupName = g.groupName }).Distinct();                                        
                }
                else
                {
                    var groups = usersData.Where(g => g.categoryId == Convert.ToInt32(categoryId)).Select(g => new { groupId = g.groupId, groupName = g.groupName }).Distinct();         
                    
                }

                lstGroups.DataValueField = "groupId";
                lstGroups.DataTextField = "groupName";
                lstGroups.DataSource = groups; 
                lstGroups.DataBind();

标签: c#linq

解决方案


您在and块中group创建了变量。您无法在这些块之外访问该变量。这就是您收到此错误的原因。ifelse

解决方案是在块groups之前声明变量。if

在里面ifelse您正在创建一个动态创建的对象列表,这些对象具有groupIdgroupName属性。您不能创建此类未知类型的列表。

解决方案 1

因此,您可以使用 type 来代替动态类型的对象Tuple<,>

以下代码将创建一个类型列表Tuple<int, string>。并使用Select.

var groups = new List<Tuple<int, string>>();

if (categoryId == null)
{
    groups = usersData
        .Where(g => g.groupName != null)
        .Select(g => new Tuple<int, string>(g.groupId, g.groupName))
        .Distinct();                                        
}
else
{
    groups = usersData
        .Where(g => g.categoryId == Convert.ToInt32(categoryId))
        .Select(g => new Tuple<int, string>(g.groupId, g.groupName))
        .Distinct();
}

元组具有属性Item1和,Item2您可以按以下方式使用它们。DataValueFieldDataTextField

lstGroups.DataValueField = "Item1";
lstGroups.DataTextField = "Item2";
lstGroups.DataSource = groups.ToList(); 
lstGroups.DataBind();

解决方案 2

您还可以使用命名值元组,这使您可以更好地控制如何访问元组值。

var groups = new List<(int groupId, string groupName)>();

上面的列表是元组值。您可以使用名称groupId和访问单个元组的值groupName

if (categoryId == null)
{
    groups = usersData
        .Where(g => g.groupName != null)
        .Select(g => (g.groupId, g.groupName))
        .Distinct();                                        
}
else
{
    groups = usersData
        .Where(g => g.categoryId == Convert.ToInt32(categoryId))
        .Select(g => (g.groupId, g.groupName))
        .Distinct();
}

现在您可以使用groupIdgroupName元组值的名称分配给DataValueFieldDataTextField

lstGroups.DataValueField = "groupId";
lstGroups.DataTextField = "groupName";
lstGroups.DataSource = groups.ToList(); 
lstGroups.DataBind();

推荐阅读