代码之家  ›  专栏  ›  技术社区  ›  RPM1984

如何在保存到数据库之前维护唯一列表?-C类#

  •  1
  • RPM1984  · 技术社区  · 15 年前

    一个简化的场景:

    • 我有一个 List<Foo> .
    • Foo 有两个属性 说明 ( 一串 ), 伊索 ( 布尔 )

    例如:

    var foos = new List<Foo>();
    

    用户可以通过文本框“添加新的Foo”,然后在表单提交时执行以下操作:

    foos.Add(new Foo { Description = txtOne.Text, IsFoo = true });
    foos.SaveToDb();
    

    但是,有 多个文本框 ,例如,如果他们在文本框1中键入“FooBar”,然后在文本框2中键入“FooBar”,则 不想显示错误 ,但我只是不想将它们添加到集合中。(不要担心背后的原因,这是一个简化的场景)。

    我不需要向UI显示任何内容,只要他们提交表单,在持久化到数据库之前,我需要删除任何重复项(或者首先防止它们被添加到列表中)。

    最简单/最好的方法是什么?也许是字典?

    我用的是C#4,LINQ,.NET 4。

    3 回复  |  直到 15 年前
        1
  •  3
  •   SLaks    15 年前

    你可以用 HashSet<Foo> .

    哈希集是唯一的无序集合。
    添加一个已经存在的元素将无声无息。(和返回 false )

    注意你 必须 覆盖 Equals GetHashCode Foo 类按值进行比较。

    还要注意,哈希集本质上是无序的;如果关心插入顺序,就不能使用它。


    或者,可以使用LINQ检查列表是否有重复项:

    if (!foos.Any(f => f.Description == txtOne.Text))
        foos.Add(new Foo { Description = txtOne.Text, IsFoo = true });
    
        2
  •  2
  •   cdhowie    15 年前

    要扩展SLaks的答案,您可以这样做:

    public class FooComparer : IEqualityComparer<Foo> {
        public static readonly FooComparer Instance = new FooComparer();
    
        private FooComparer() { }
    
        public bool Equals(Foo a, Foo b) {
            if (a == null)
                return b == null;
    
            if (b == null)
                return false;
    
            // For case-sensitivity:
            return a.Description == b.Description;
    
            // For case-insensitivity:
            return String.Equals(a.Description, b.Description, StringComparison.OrdinalIgnoreCase);
        }
    
        public int GetHashCode(Foo obj) {
            // For case-sensitivity:
            return obj.Description.GetHashCode();
    
            // For case-insensitivity:
            return StringComparer.OrdinalIgnoreCase.GetHashCode(obj.Description);
        }
    }
    

    然后把你的东西放在 HashSet<Foo> 就像这样:

    var hashSet = new HashSet<Foo>(FooComparer.Instance);
    hashSet.Add(new Foo() { ... });
    

    有了这个密码,如果 Foo 对象被添加到哈希集中,并且具有与哈希集中已存在的对象相同的描述,新对象将不会被添加。

        3
  •  0
  •   Mr Shoubs    15 年前

    你能在linq中使用Distinct吗?

    这是VB(我在这台机器上没有VS),但大致如下:

    Dim ie as IEnumerable(of Foo)=在Foo的Select obj Distinct中从obj作为Foo

    那就暗示我是合格的比较者?-好像@cdhowie刚回答。。。。

    推荐文章