首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有IList<SelectedItemList>问题的LINQ

带有IList<SelectedItemList>问题的LINQ
EN

Stack Overflow用户
提问于 2012-07-04 19:18:42
回答 3查看 1.6K关注 0票数 1

我有一个数据表,需要在其中将每一行转换为IList

代码语言:javascript
复制
public IList<SelectListItem> _area = new List<SelectListItem>();
public IList<SelectListItem> _team = new List<SelectListItem>();

     foreach (DataRow row in dt.Rows)
            {
       _area.Add(new SelectListItem() { Text = row[1].ToString(), Value = row[1].ToString() });
       _team.Add(new SelectListItem() { Text = row[0].ToString(), Value = row[0].ToString() });

            }

然后在_area中获得的数据如下所示:

代码语言:javascript
复制
Text                     Value
OMC                      OMC
OMC                      OMC
OMC                      OMC
SIAM                     SIAM
SIAM                     SIAM
SIAM                     SIAM                     
SIAM                     SIAM                     
SIAM                     SIAM

我需要使用LINQ来获取不同的值。

我已经尝试过简单地使用:

代码语言:javascript
复制
_area.Distinct();

但我只剩下32个条目,我一开始就是?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-04 19:26:16

代码语言:javascript
复制
_area.GroupBy(x => x.Value).Select(x => x.Key);

这将为您提供这些区域的不同值。

这样怎么样?

代码语言:javascript
复制
_area.GroupBy(x => x.Value).Select(x => x.First());

你能更好地解释什么是不同的吗?也许你应该覆盖Equals和GetHashCode,这样它就会工作在不同的地方,就像这样

代码语言:javascript
复制
class Foo
{
    public string Text { get; set; }
    public string Value { get; set; }

    public override bool Equals(object obj)
    {
        var foo = obj as Foo;
        if(foo == null) return false;

        return foo.Text == Text && foo.Value == Value;
    }

    public override int GetHashCode()
    {
        return Text.GetHashCode() * Value.GetHashCode() ^ 7;    
    }
}

然后这将会像你期望的那样工作(希望如此)

代码语言:javascript
复制
_area.Distinct();
票数 2
EN

Stack Overflow用户

发布于 2012-07-04 19:21:01

你试过这个_area = _area.Distinct();吗?

票数 5
EN

Stack Overflow用户

发布于 2012-07-04 19:42:42

Distinct()方法接受IEqualityComparer<T>类型的参数,因此在本例中,您可以创建一个相等比较器来比较两个SelectListItems的两个值,如下所示:

代码语言:javascript
复制
public class SelectListItemComparer : IEqualityComparer<SelectListItem>
{
    public static SelectListItemComparer Instance = new SelectListItemComparer();
    private SelectListItemComparer() {}
    public bool Equals(SelectListItem x, SelectListItem y)
    {
        return x.Value.Equals(y.Value);
    }

    public int GetHashCode(SelectListItem obj)
    {
        return obj.Value.GetHashCode();
    }
}

然后你可以像这样使用它:

代码语言:javascript
复制
var items = new[]
                {
                    new SelectListItem {Text = "OMC", Value = "OMC"},
                    new SelectListItem {Text = "OMC", Value = "OMC"},
                    new SelectListItem {Text = "OMC", Value = "OMC"},
                    new SelectListItem {Text = "SIAM", Value = "SIAM"},
                    new SelectListItem {Text = "SIAM", Value = "SIAM"},
                    new SelectListItem {Text = "SIAM", Value = "SIAM"},
                    new SelectListItem {Text = "SIAM", Value = "SIAM"},
                    new SelectListItem {Text = "SIAM", Value = "SIAM"}
                };

var comparer = new SelectListItemComparer();
var t1 = items.Distinct(SelectListItemComparer.Instance).ToList();

t1现在将只包含两个元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11328032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档