C# 集合的数据绑定

C# 集合的数据绑定,c#,data-binding,collections,C#,Data Binding,Collections,我只想将一个集合绑定到另一个集合: 假设有一个 List<string> original = new List<string>(); 还有一个 List<string> extended = new List<string>(from curItem in originals select curItem + "_extension"); 因此,扩展的项与原始项相同,但在末尾有一个_扩展 我想要的是将扩展绑定到原始,这

我只想将一个集合绑定到另一个集合: 假设有一个

List<string> original = new List<string>();
还有一个

List<string> extended = 
           new List<string>(from curItem in originals select curItem + "_extension");
因此,扩展的项与原始项相同,但在末尾有一个_扩展

我想要的是将扩展绑定到原始,这样,如果原始更改,扩展也会更改

我知道每次我都可以使用事件并重新创建扩展。 但我认为这是没有效率的

编辑: 比如说:原始文件很大,要重新创建扩展文件的单个元素太费劲了,创建单个元素也太费劲了。 因此,我希望有两个列表或集合,其中on观察另一个列表或集合并添加或删除更改,如Wpf中的数据绑定,但添加一个扩展。

创建自己的类:

public class MyClass
{
   private string _Item;
   public string Item 
   { 
       get { return _Item; }
       set 
       {
           if (_Item != value)
           {
               _Item = value;
               _ItemWithExtension = _Item + "_extension";
           }
       }
   }
   private string _ItemWithExtension;
   public string ItemWithExtension
   {
      get { return _ItemWithExtension; }
   }
}

var extended = 
           new List<MyClass>(from curItem in originals select 
                            new MyClass()
                            {
                                Item = curItem
                            }
                           );
您可以使用System.ComponentModel上的类来实现此功能。。。也许这就像用锤子打死一只苍蝇,但会有更复杂的例子

我想你可以这样做一个扩展方法:

static class ExtensionMethods
{
    public static IEnumerable<string> Extensions(this IEnumerable<string> strs)
    {
        foreach (var str in strs)
        {
            yield return str + "_extension";
        }
    }
}

我认为有两种不同的方法:

当原始更改时更改扩展。 根本不创建扩展类,而是创建一些类,这将 在每个查询上添加扩展名。 使用bindingList,第一种方法将足够有效

public class MyClass
{
    private BindingList<string> original = new BindingList<string>();
    private List<string> extended = new List<string>();

    public BindingList<string> Original
    {
        get
        {
            return original;
        }
    }

    public IEnumerable<string> Extended
    {
        get
        {
            return extended;
        }
    }

    public MyClass()
    {
        original.ListChanged += OnChanging;
    }

    void OnChanging(object sender, ListChangedEventArgs e)
    {
        switch (e.ListChangedType)
        {
            case ListChangedType.ItemAdded:
                extended.Add(original[e.NewIndex] + "_extention");
                break;
            case ListChangedType.ItemChanged:
                extended[e.NewIndex] = original[e.NewIndex] + "_extention";
                break;
            case ListChangedType.ItemDeleted:
                extended.RemoveAt(e.NewIndex);
                break;
            case ListChangedType.ItemMoved:
                string tmp = extended[e.NewIndex];
                extended[e.NewIndex] = extended[e.OldIndex];
                extended[e.OldIndex] = tmp;
                break;
            case ListChangedType.Reset:
                extended = new List<string>();
                foreach (string originalItem in original)
                {
                    extended.Add(originalItem + "_extention");
                }
                break;
        }
    }
}

更改原始项对扩展项有何影响?@Amiram Korach:您的解决方案的问题是,每次访问新项时,新项都会被重新创建。但我觉得这也让人筋疲力尽。我希望扩展后的项目能够观察原始项目并及时添加新项目。@阿米拉姆:如果我扩展了[0],该怎么办?ItemWithExtension?我将得到*\u分机_extension@DmitryDovgopoly,当您更改项目时,带有扩展名的项目将被更改,但我会改进我的答案。@Amiram Korach但我认为,扩展名不会更新,如果原始项发生更改…请检查返回电流;行中,我想它应该是returncurrentstring。bindingslist可能是我正在寻找的东西:它提供了报告更改的方法。但是我仍然需要为扩展类创建自己的列表类扩展,它可以处理这些更改。有没有什么已经实现了呢?看一看,检查这个:谢谢,但也许我会使用ObservableCollection。另一方面,我不需要扩展扩展的List类,因为我需要一个处理更改内容的方法。。。
public class MyClass
{
    private BindingList<string> original = new BindingList<string>();
    private List<string> extended = new List<string>();

    public BindingList<string> Original
    {
        get
        {
            return original;
        }
    }

    public IEnumerable<string> Extended
    {
        get
        {
            return extended;
        }
    }

    public MyClass()
    {
        original.ListChanged += OnChanging;
    }

    void OnChanging(object sender, ListChangedEventArgs e)
    {
        switch (e.ListChangedType)
        {
            case ListChangedType.ItemAdded:
                extended.Add(original[e.NewIndex] + "_extention");
                break;
            case ListChangedType.ItemChanged:
                extended[e.NewIndex] = original[e.NewIndex] + "_extention";
                break;
            case ListChangedType.ItemDeleted:
                extended.RemoveAt(e.NewIndex);
                break;
            case ListChangedType.ItemMoved:
                string tmp = extended[e.NewIndex];
                extended[e.NewIndex] = extended[e.OldIndex];
                extended[e.OldIndex] = tmp;
                break;
            case ListChangedType.Reset:
                extended = new List<string>();
                foreach (string originalItem in original)
                {
                    extended.Add(originalItem + "_extention");
                }
                break;
        }
    }
}
public class MyExtendedList : IEnumerable
{
    private List<string> original;
    public MyExtendedList(List<String> original)
    {
        this.original = original;
    }

    public IEnumerator GetEnumerator()
    {
        return new ExtendedEnum(original);
    }
}

public class ExtendedEnum : IEnumerator
{
    private List<string> original;
    private int position = -1;
    public ExtendedEnum(List<String> original)
    {
        this.original = original;
    }

    public object Current
    {
        get
        {
            return CurrentString;
        }
    }

    public bool MoveNext()
    {
        position++;
        return (position < original.Count);
    }

    public void Reset()
    {
        position = -1;
    }

    public String CurrentString
    {
        get
        {
            try
            {
                return original[position] + "_extension";
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}