tijian_tieying/web/cyqdata-master/Table/MDataRowCollection.cs
2025-02-20 12:14:39 +08:00

408 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using CYQ.Data.SQL;
using System.ComponentModel;
using System.Collections;
using System.Data;
namespace CYQ.Data.Table
{
/// <summary>
/// 行集合
/// </summary>
public partial class MDataRowCollection
{
List<MDataRow> RowList;
/// <summary>
/// 隐式转换列头
/// </summary>
/// <param name="rows"></param>
/// <returns></returns>
public static implicit operator MDataRowCollection(DataRowCollection rows)
{
MDataRowCollection mrc = new MDataRowCollection();
if (rows != null && rows.Count > 0)
{
foreach (DataRow row in rows)
{
mrc.Add(row);
}
}
return mrc;
}
public static implicit operator MDataRowCollection(List<MDataRow> rows)
{
MDataRowCollection mrc = new MDataRowCollection();
if (rows != null && rows.Count > 0)
{
foreach (MDataRow row in rows)
{
mrc.Add(row);
}
}
return mrc;
}
internal MDataRowCollection()
{
RowList = new List<MDataRow>(100);
}
internal MDataRowCollection(MDataTable dt)
{
RowList = new List<MDataRow>(100);
_Table = dt;
}
//private static int cCount = 0;
private MDataTable _Table;
/// <summary>
/// 获取该行拥有其架构的 MDataTable。
/// </summary>
public MDataTable Table
{
get
{
return _Table;
}
internal set
{
_Table = value;
}
}
}
public partial class MDataRowCollection : IList<MDataRow>
{
#region IList相关方法
/// <summary>
/// 创建使用指定值的行,并将其添加到 MDataRowCollection 中
/// </summary>
/// <param name="values"></param>
public void Add(params object[] values)
{
if (_Table != null)
{
if (values != null && values.Length <= _Table.Columns.Count)
{
_Table.NewRow(true).LoadFrom(values);
}
}
}
/// <summary>
/// 添加行[默认重置状态为true]
/// </summary>
/// <param name="item">行</param>
/// <param name="resetState">重置状态,[默认true]重置后的行数据不参与MDataTable的批量更新操作,状态在重新赋值时改变。</param>
public void Add(MDataRow item, bool resetState)
{
if (resetState)
{
item.SetState(0);
}
CheckError(item, null);
RowList.Add(item);
}
public void Add(MDataRow item)
{
Add(item, true);
}
public void AddRange(IEnumerable<MDataRow> collection)
{
CheckError(null, collection);
RowList.AddRange(collection);
}
public void Insert(int index, MDataRow item)
{
CheckError(item, null);
RowList.Insert(index, item);
}
public void InsertRange(int index, IEnumerable<MDataRow> collection)
{
CheckError(null, collection);
RowList.InsertRange(index, collection);
}
private void CheckError(MDataRow item, IEnumerable<MDataRow> collection)
{
if (_Table != null)
{
if (item != null)
{
if (item.Columns != _Table.Columns)
{
Error.Throw("This row already belongs to another table");
}
item.Table = _Table;
}
else
{
using (IEnumerator<MDataRow> ie = collection.GetEnumerator())
{
while (ie.MoveNext())
{
if (ie.Current.Columns != _Table.Columns)
{
Error.Throw("This row already belongs to another table");
}
ie.Current.Table = _Table;
}
}
}
}
}
public bool Remove(MDataRow item)
{
RowList.Remove(item);
return true;
}
public void RemoveAt(int index)
{
RowList.RemoveAt(index);
}
#endregion
public void Clear()
{
RowList.Clear();
}
#region IList<MDataRow>
int IList<MDataRow>.IndexOf(MDataRow item)
{
return RowList.IndexOf(item);
}
public MDataRow this[int index]
{
get
{
return RowList[index];
}
set
{
Error.Throw(AppConst.Global_NotImplemented);
}
}
#endregion
#region ICollection<MDataRow>
public bool Contains(MDataRow item)
{
return RowList.Contains(item);
}
void ICollection<MDataRow>.CopyTo(MDataRow[] array, int arrayIndex)
{
RowList.CopyTo(array, arrayIndex);
}
public int Count
{
get { return RowList.Count; }
}
bool ICollection<MDataRow>.IsReadOnly
{
get { return false; }
}
internal List<MDataRow> FindAll(Predicate<MDataRow> match)
{
return RowList.FindAll(match);
}
internal void RemoveRange(int index, int count)
{
RowList.RemoveRange(index, count);
}
#endregion
#region IEnumerable<MDataRow>
IEnumerator<MDataRow> IEnumerable<MDataRow>.GetEnumerator()
{
return RowList.GetEnumerator();
}
#endregion
}
public partial class MDataRowCollection : IComparer<MDataRow>
{
private int lastIndex = -1;//上一个索引,在多重排序中,如果二次排序遇到相同的值,采用上一个索引字段进行比较
private bool lastIsAsc = true;
private int index = -1, groupID = -1;
private bool isAsc = true;
private int useLastIndexState = 0;//0未使用,1开启使用,2正在使用
// private object objAValue, objBValue;
public int Compare(MDataRow x, MDataRow y)
{
// cCount++;
if (x == y)//自己和自己比返回0跳出
{
return 0;
}
int cellIndex = index;
bool cellIsAsc = isAsc;
int cellGroupID = groupID;
if (useLastIndexState == 1)//出于多重排序的需要这么使用。
{
cellIndex = lastIndex;
cellIsAsc = lastIsAsc;
useLastIndexState = 2;
cellGroupID = DataType.GetGroup(x[cellIndex].Struct.SqlType);
}
else if (useLastIndexState == 2)
{
useLastIndexState = 0;
}
//Null判断处理
if (x[cellIndex].IsNull && y[cellIndex].IsNull)
{
return 0;
}
else if (x[cellIndex].IsNull)
{
return cellIsAsc ? -1 : 1;
}
else if (y[cellIndex].IsNull)
{
return cellIsAsc ? 1 : -1;
}
object objAValue = x[cellIndex].Value;
object objBValue = y[cellIndex].Value;
switch (cellGroupID)
{
case 1:
case 3:
double vA, vB;
if (cellGroupID == 1)
{
double.TryParse(objAValue.ToString(), out vA);
double.TryParse(objBValue.ToString(), out vB);
//vA = (int)objAValue;
//vB = (int)objBValue;
}
else
{
vA = (bool)objAValue ? 1 : 0;
vB = (bool)objBValue ? 1 : 0;
}
if (vA > vB) { return cellIsAsc ? 1 : -1; }
else if (vA < vB) { return cellIsAsc ? -1 : 1; }
else
{
if (lastIndex > -1 && useLastIndexState == 0)
{
useLastIndexState = 1;//标志为正在使用
return Compare(x, y);
}
return 0;
}
case 2:
return cellIsAsc ? Comparer<DateTime>.Default.Compare((DateTime)objAValue, (DateTime)objBValue) : Comparer<DateTime>.Default.Compare((DateTime)objBValue, (DateTime)objAValue);
default:
//直接性能差一点return cellIsAsc ? Comparer<string>.Default.Compare((string)objAValue, (string)objBValue) : Comparer<string>.Default.Compare((string)objBValue, (string)objAValue);
if (cellIsAsc)
{
return Convert.ToString(objAValue).CompareTo(objBValue.ToString());
}
else
{
return Convert.ToString(objBValue).CompareTo(objAValue.ToString());
}
}
}
public void Sort(string orderby)
{
if (string.IsNullOrEmpty(orderby) || this.Count < 2) { return; }
orderby = orderby.Trim();
if (orderby.ToLower().StartsWith("order by"))
{
orderby = orderby.Substring(9);//去掉order by 前缀
}
string[] orderbyList = orderby.Split(',');//分隔多个order by 语句
string[] orderbyItems;
for (int i = orderbyList.Length - 1; i > -1; i--)//反转循环
{
if (string.IsNullOrEmpty(orderbyList[i]))
{
continue;
}
orderbyItems = orderbyList[i].Split(' ');//分隔
index = this[0].Columns.GetIndex(orderbyItems[0]);
if (index > -1)
{
isAsc = (orderbyItems.Length > 1 && orderbyItems[1].ToLower() == "desc") ? false : true;
groupID = DataType.GetGroup(this[0][index].Struct.SqlType);
// cCount = 0;
RowList.Sort(Compare);
lastIndex = index;
lastIsAsc = isAsc;
}
}
index = -1;
lastIndex = -1;
}
}
//public partial class MDataroCollection : ICollection, IEnumerable
//{
// #region ICollection 成员
// LinkedList<MDataRow> rows = new LinkedList<MDataRow>();
// public void CopyTo(Array array, int index)
// {
// rows.CopyTo(array, index);
// throw new Exception("The method or operation is not implemented.");
// }
// public int Count
// {
// get { throw new Exception("The method or operation is not implemented."); }
// }
// public bool IsSynchronized
// {
// get { throw new Exception("The method or operation is not implemented."); }
// }
// public object SyncRoot
// {
// get { throw new Exception("The method or operation is not implemented."); }
// }
// #endregion
// #region IEnumerable 成员
// public IEnumerator GetEnumerator()
// {
// throw new Exception("The method or operation is not implemented.");
// }
// #endregion
// #region IEnumerable 成员
// IEnumerator IEnumerable.GetEnumerator()
// {
// throw new Exception("The method or operation is not implemented.");
// }
// #endregion
//}
}