1

各行をIListに変換する必要があるDatatableがあります

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 で取得されるデータは次のようになります:-

Text                     Value
OMC                      OMC
OMC                      OMC
OMC                      OMC
SIAM                     SIAM
SIAM                     SIAM
SIAM                     SIAM                     
SIAM                     SIAM                     
SIAM                     SIAM

DISTINCT 値を取得するには、LINQ を使用する必要があります。

私は単に使用してみました:-

_area.Distinct();

しかし、私が始めた32のエントリが残っています???

4

3 に答える 3

5

これを試しましたか_area = _area.Distinct();

于 2012-07-04T11:21:00.637 に答える
2

このDistinct()メソッドは type のパラメーターを取るIEqualityComparer<T>ため、この場合、次のSelectListItemsように 2 つの 2 つの値を比較する等値比較子を作成できます。

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には 2 つの要素のみが含まれます。

于 2012-07-04T11:42:41.767 に答える
2
_area.GroupBy(x => x.Value).Select(x => x.Key);

これにより、領域の明確な値が得られます...

このようにいかがですか

_area.GroupBy(x => x.Value).Select(x => x.First());

Distinctとは何かをよりよく説明できますか?EqualsとGetHashCodeをオーバーライドする必要があるかもしれません。そうすれば、Distinctが機能します。このようなものです

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.Distinct();
于 2012-07-04T11:26:16.403 に答える