Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ与IList<;SelectedItemList>;问题_C#_Linq - Fatal编程技术网

C# LINQ与IList<;SelectedItemList>;问题

C# LINQ与IList<;SelectedItemList>;问题,c#,linq,C#,Linq,我有一个Datatable,其中我需要将每一行转换为IList public IList<SelectListItem> _area = new List<SelectListItem>(); public IList<SelectListItem> _team = new List<SelectListItem>(); foreach (DataRow row in dt.Rows) { _are

我有一个Datatable,其中我需要将每一行转换为IList

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() });

            }
我需要使用LINQ来获得不同的值

我尝试过简单地使用:-

_area.Distinct();

但我只剩下32个我开始时使用的条目了???

您是否尝试过这个
\u area=\u area.Distinct()

您是否尝试过此
\u area=\u area.Distinct()

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

像这样怎么样

_area.GroupBy(x => x.Value).Select(x => x.First());
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;    
    }
}
你能更好地解释什么是Distinct吗?也许你应该重写Equals和GetHashCode,这样它就可以处理Distinct,类似这样的事情

_area.GroupBy(x => x.Value).Select(x => x.First());
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;    
    }
}
然后这将如您所期望的那样起作用(希望如此)

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

像这样怎么样

_area.GroupBy(x => x.Value).Select(x => x.First());
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;    
    }
}
你能更好地解释什么是Distinct吗?也许你应该重写Equals和GetHashCode,这样它就可以处理Distinct,类似这样的事情

_area.GroupBy(x => x.Value).Select(x => x.First());
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;    
    }
}
然后这将如您所期望的那样起作用(希望如此)

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

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();
    }
}
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
现在只包含两个元素。

Distinct()
方法采用类型为
IEqualityComparer
的参数,因此在这种情况下,您可以创建一个相等比较器来比较两个
SelectListItems
的两个值,如下所示:

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();
    }
}
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
现在将只包含两个元素。

SelectedListItem不会覆盖Equals,对吗?您需要将其重新分配到
\u区域
中,就像
\u区域=\u区域.Distinct()
@Max一样,我认为您是对的。它应该覆盖HashCode到SelectedListItem不覆盖Equals,对吗?你需要像
\u area=\u area.Distinct()一样将其重新分配到
\u area
@Max,我想你是对的。它应该覆盖HashCode,因为它无法将IEnumerable转换为IlistI。我已经这样做了,它编译了,但是列表仍然有32个条目,这太奇怪了!无法将IEnumerable转换为IlistI。如果您完成了此操作,它会编译,但列表仍有32个条目,这太奇怪了!我不能这样做,它不允许我在选择命令后引用x我不能这样做,它不允许我在选择命令后引用x